sql-server - 在触发器顶部添加 SET NOCOUNT ON

标签 sql-server sql-server-2008-r2

我编写了几个触发器来以这种方式更新多个表的修改时间:

CREATE TABLE foo (
    foo_id INT IDENTITY(1, 1) NOT NULL,
    -- [...]

    created_on DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
    updated_on DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,

    CONSTRAINT foo_pk PRIMARY KEY (foo_id)
);

CREATE TRIGGER foo_trg1 ON foo
FOR UPDATE
AS BEGIN
    UPDATE foo
    SET updated_on = CURRENT_TIMESTAMP
    FROM INSERTED ins
    WHERE foo.foo_id = ins.foo_id;
END;

无论出于什么原因,我现在没有时间进行调试,我的 PHP 客户端代码在发出一系列查询时触发了 SQL 错误,尽管它只发生在一个特定的表中:

A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active.

looked up what SET NOCOUNT means并猜测错误会在我的触发器中启用它,因为它实际上发生了:

CREATE TRIGGER foo_trg1 ON foo
FOR UPDATE
AS BEGIN
    SET NOCOUNT ON; -- Problem solved!

    UPDATE foo
    SET updated_on = CURRENT_TIMESTAMP
    FROM INSERTED ins
    WHERE foo.foo_id = ins.foo_id;
END;

我的问题是:

  1. 将其添加到我的所有 updated_on 触发器中是否安全?
  2. 我的假设在这种情况下性能提升可以忽略不计,这样正确吗?

最佳答案

简短的答案是肯定的,将其添加到所有位置的顶部并不是一个坏主意,但需要注意的是,这可能可能不会影响您。

如果您将服务器选项设置为零,则在 SSIS 内的事务中使用时,设置 NoCount 可能会产生一些意想不到的副作用。

Exec sp_configure 'show advanced options', 1
reconfigure
Exec sp_configure 'disallow results from triggers', 1
reconfigure

允许来自触发器的结果集是一项已弃用的功能,最终将被删除(通过将上述设置设置为开箱即用的 1)。

如果您不愿意更改服务器范围的设置,并且在 SSIS 包中遇到奇怪的事务错误,请在触发器结束时将 NoCount 设置为 Off。

此外,请记住,触发器中发生的情况是任何调用过程的一部分,因此如果出于任何原因您在触发触发器的表更改之前将 NoCount 设置为 Off,则该值将被重置。

关于sql-server - 在触发器顶部添加 SET NOCOUNT ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32648590/

相关文章:

sql-server - 将查询结果导出到 Excel Microsoft SQL Server 2012 时找不到源数据类型 "200"错误

sql-server - SQL 拆分制表符分隔列

asp.net - 列出 ASP.NET 面试主题

json - 在 Sql Server 中创建 json 对象并聚合成 json 数组

c# - 如何通过互联网连接sql server?

c# - SQL Server 2008 错误 - XML 分析 : document parsing required too much memory

c# - 以编程方式创建 SQL Server 表

java - 使用Java以二进制格式将图像存储在数据库中

sql-server - 在 SQL 上将行转换为字符串

sql-server - 为什么只有部分用户收到错误 : "Connection is busy with results for another command"