【发布时间】:2015-04-14 08:00:58
【问题描述】:
我有一张桌子Test 有列
InveCode varchar(50)
itemid numeric(2)
rowid numeric identity,
purdate date
我在这张桌子上有一个触发器。
Create trigger [dbo].[TrgInveCode]
on [dbo].[test]
after insert
as
declare @itemid numeric(10)
declare @total numeric(10)
declare @rowid numeric(18)
declare @Date date
select @itemid = i.itemid from inserted i
select @rowid = i.rowid from inserted i
select @Date = i.purdate from inserted i
select @total = count(itemid)
from test
where itemid = @itemid and year(purdate) = year(@date)
update test
set invecode= cast(@itemid as varchar(50)) + '-' + cast(year(@Date) as varchar(50)) + '-' + cast(@total as varchar(50))
where rowid = @rowid
当我使用这个命令时
insert into test(itemid, purdate, buyingyear)
output inserted.invecode
values(@itemid, @purdate, @buyingyear)
在 vb.net 中,我收到此错误:
如果语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句的目标表“test”不能有任何启用的触发器。
【问题讨论】:
-
哪个 dbms? (大多数 dbms 产品的触发器不是 ANSI SQL...)
-
您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器每个语句触发一次,因此如果您的
UPDATE语句影响 25 行,您将触发触发器一次,然后是Inserted和 @987654328 @ 每个将包含 25 行。您的代码将在这 25 行中选择哪一行?SELECT i.RowId FROM Inserted i- 它是不确定的,你会得到任意行,而其他 24 行将被忽略。您需要重写触发器以考虑到这一点! -
错误很明显:如果表上有触发器,则不能以这种方式使用
OUTPUT子句。要么使用OUTPUT inserted.invecode INTO .........,要么根本不使用OUTPUT -
请写完整的代码。 Marc_s
标签: sql-server vb.net triggers insert