触发器使表格和交叉数据库之间自动同步变得更容易。但是其性能可能会受到很大的影响。这里我将指出一个能减少这种无法预料问题影响的命令。例如,当INSERT触发器重复地被激活,尤其当使用“INSERT INTO”语句进行大量的插入操作,在这种触发器一再被激活的情况下,触发器每个插入操作会发出“DONE_IN_PROC”信息,这会严重地减慢速度。
如果触发器正在获取结构化查询语言服务器代理程序的结果,这种减速尤其明显。结构化查询语言服务器代理程序自动地对后来的每个“DONE_IN_PROC”信号施加一个延时,以避免服务器拥塞。如果你尝试通过查询分析器运行同样的指令集,由于没有这样的延时,它将执行得更快。如果你通过查询分析器运行这样的一个查询,并且检查多重的" n rows affected "语句,很可能查询会被重复地进行并且比实际所需的再多激活触发器很多次。
关闭“DONE_IN_PROC”信息,可以在一个触发器语句开始的时候使用“SET NOCOUNT ON”命令。触发器时常不需要行计数器。如果是这样,你可以考虑改变激活触发器的命令(或者触发器本身),使得所有变更一次完成。如果这过程仍然费时太久,为了简化起见,你应该重新考虑触发器被激活的方式。
SET NOCOUNT
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。
语法
SET NOCOUNT { ON | OFF }
注释
当 SET NOCOUNT 为ON时,不返回计数(表示受Transact-SQL语句影响的行数),但会更新@@ROWCount。
当SET NOCOUNT为OFF时,返回计数。
当SET NOCOUNT为 ON时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft SQL Server 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"n rows affected"。
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
SET NOCOUNT设置是在执行或运行时设置,而不是在分析时设置。
权限
SET NOCOUNT 权限默认授予所有用户。