C# 无法获取插入行的标识。触发器返回结果集和服务器选项';不允许来自触发器的结果';是真的

C# 无法获取插入行的标识。触发器返回结果集和服务器选项';不允许来自触发器的结果';是真的,c#,sql-server,triggers,C#,Sql Server,Triggers,我有一个C#程序,它可以插入到具有标识列(id)的表中 C#代码 SQL触发器 代码工作正常,但触发器使@@identity成为log\u表的insert语句 所以我在触发器的底部添加了这一行: begin declare @row_id int; select @row_id = id from inserted; insert into log_table(remarks1,remarks2) values ('new row inserted',@row_id); se

我有一个C#程序,它可以插入到具有标识列(id)的表中

C#代码 SQL触发器 代码工作正常,但触发器使
@@identity
成为
log\u表的
insert语句

所以我在触发器的底部添加了这一行:

begin
  declare @row_id int;

  select @row_id = id from inserted;

  insert into log_table(remarks1,remarks2) values ('new row inserted',@row_id);

 select @row_id;   -- this is causing the error

end
GO
现在触发器会引发一个错误:

触发器返回了一个resultset,服务器选项“disallow results from triggers”为true

我没有修改服务器变量的权限。
我只想让触发器插入到日志中,然后将插入的id返回到c#。。我该怎么做呢?

@@identity
已知有缺陷,因为它根据会话中执行的最后一次插入提供了答案

如果您切换到,正如大多数人已经建议的那样,它将在不必更改触发器的情况下解决问题-因为触发器定义了自己的范围

例如,有两个表,T1和T2,并且在T1上定义了一个插入触发器。当一行插入到T1时,触发器触发并在T2中插入一行。此场景演示了两个作用域:触发器在T1上的插入和在T2上的插入

假设T1和T2都有标识列,@@identity和SCOPE_identity在T1的INSERT语句末尾返回不同的值@@IDENTITY返回在当前会话的任何作用域中插入的最后一个标识列值。[…]SCOPE_IDENTITY()返回插入T1中的标识值


另外,请注意,当前触发器已损坏-它假定插入的
正好包含一行,而实际上可能包含0、1或多行。相反,您应该有如下内容:

CREATE TRIGGER [dbo].[trg_my_trigger] ON [dbo].[my_table]
WITH EXEC AS CALLER
AFTER INSERT
AS
begin
  insert into log_table(remarks1,remarks2)
  select 'new row inserted',id
  from inserted
end
GO

也许您需要另一个“标识”字段,例如SCOPE_identity()@尼尔:你说得对。我切换到SCOPE_IDENTITY()并成功了!如果您将此作为答案发布,我将接受。如果为true,则此规则有一个例外:如果触发器是
而不是insert
scope\u identity()
将不会返回正确的结果。不过,我不确定output子句将如何处理它。
begin
  declare @row_id int;

  select @row_id = id from inserted;

  insert into log_table(remarks1,remarks2) values ('new row inserted',@row_id);

 select @row_id;   -- this is causing the error

end
GO
CREATE TRIGGER [dbo].[trg_my_trigger] ON [dbo].[my_table]
WITH EXEC AS CALLER
AFTER INSERT
AS
begin
  insert into log_table(remarks1,remarks2)
  select 'new row inserted',id
  from inserted
end
GO