Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 当没有更改数据表行时,不计数输出1行或多行的触发器受到影响_Sql Server_Tsql_Database Trigger_Nocount - Fatal编程技术网

Sql server 当没有更改数据表行时,不计数输出1行或多行的触发器受到影响

Sql server 当没有更改数据表行时,不计数输出1行或多行的触发器受到影响,sql-server,tsql,database-trigger,nocount,Sql Server,Tsql,Database Trigger,Nocount,我正在使用SQL Server 2012。我在视图上有触发器,目的是允许我的用户像在其他表上一样在视图上执行DML操作。这些触发器有设置NOCOUNT ON和许多IF…RAISERROR(…)RETURN语句来捕获逻辑错误。我注意到,即使在不影响任何基础表的情况下返回触发器,SSMS也会输出“n个或多个受影响的行”,其中n是视图中受影响的行数。因此,我测试了以下简单触发器,结果相同: CREATE TRIGGER dbo.triggerViewTest ON dbo.viewTest INST

我正在使用SQL Server 2012。我在视图上有触发器,目的是允许我的用户像在其他表上一样在视图上执行DML操作。这些触发器有
设置NOCOUNT ON
和许多
IF…RAISERROR(…)RETURN
语句来捕获逻辑错误。我注意到,即使在不影响任何基础表的情况下返回触发器,SSMS也会输出“n个或多个受影响的行”,其中n是视图中受影响的行数。因此,我测试了以下简单触发器,结果相同:

CREATE TRIGGER dbo.triggerViewTest 
ON dbo.viewTest
INSTEAD OF INSERT AS
BEGIN
    SET NOCOUNT ON
    IF 1 != 0
    BEGIN
        RAISERROR('No rows should be affected!', 16, 1)
        RETURN
    END
END

INSERT INTO dbo.viewTest (columnA) VALUES (1)
和SSMS打印受影响的
1行


如何抑制此输出?

以下内容将阻止此消息返回控制台。 它与会话设置有关,而与触发器代码无关

set nocount on
insert into viewTest select...
set nocount off

根据@Eralper所说的回答我自己的问题;此消息来自会话设置,而不是触发器。因此,防止该消息的唯一方法是抛出一个错误,该错误将取消该会话(
RAISERROR()
不会取消该会话)。以下触发器不显示受影响的
n行

CREATE TRIGGER dbo.triggerViewTest 
ON dbo.viewTest
INSTEAD OF INSERT AS
BEGIN
    SET NOCOUNT ON
    IF 1 != 0
    BEGIN
        ;THROW 50000, 'No rows should be affected!', 1
    END
END

INSERT INTO dbo.viewTest (columnA) VALUES (1)

这是insert中的行数,而不是触发器执行的任何操作的行数。我将此标记为答案,因为
它与会话设置相关…
是此行为的原因,而防止此消息的唯一方法是
抛出一个错误。