【问题标题】:Output with trigger带触发器的输出
【发布时间】: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


【解决方案1】:

您不能在具有触发器的表上使用OUTPUT 子句。

Cannot use UPDATE with OUTPUT clause when a trigger is on the table

你别无选择,只能OUTPUT结果INTO一个表变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2014-12-27
    相关资源
    最近更新 更多