这些答案(1,2)使用this article中的代码,建议使用语句SET NOCOUNT ON
作为临时占位符/虚拟主体,用于存储过程的正文将很快被覆盖。
这些答案和那篇文章都没有指定为什么 SET NOCOUNT ON
被选为临时存储过程体的值。
我的问题:为什么SET NOCOUNT ON
是一个临时存储过程体的好选择,如果一切顺利的话,会在后续操作中被覆盖?还有更好的选择吗?
可能构成一个好的临时/占位符存储过程体的一些标准:
ALTER
没有按计划发生,则在运行时以明显的方式失败; 答案 0 :(得分:6)
为了更好地满足我的问题中的“标准”,我已经着手用SET NOCOUNT ON
语句替换RAISEERROR
。
我在运行ALTER PROCEDURE
之前确保存储过程存在的代码最终看起来像:
-- Create the sproc with a temporary body if it doesn't exist yet.
-- We'll set the real body in the ALTER PROCEDURE statement below.
IF NOT EXISTS (
SELECT * FROM sys.objects
WHERE name = 'MyStoredProcedureNameHere'
AND type = 'P'
) BEGIN
EXEC ('CREATE PROCEDURE MyStoredProcedureNameHere AS
RAISERROR (''The ALTER PROCEDURE to set the body for MyStoredProcedureNameHere did not run as it should have!'', 16, 1);');
END
GO
ALTER PROCEDURE MyStoredProcedureNameHere AS ...
因此,如果ALTER PROCEDURE以某种方式无法运行,那么如果我的存储过程被执行,它将引发错误而不是默默地做任何事情(就像只包含SET NOCOUNT ON
的正文的情况一样)。
对此方法的信任:http://www.codeofhonor.com/blog/a-better-way-to-update-sql-stored-procedures
答案 1 :(得分:5)
这可能是因为SET NOCOUNT ON;
包括considered good practice。它包含在由SSMS生成的模板SP中。来自NOCOUNT上的MSDN文章:
NOCOUNT ON可防止向客户端发送DONE_IN_PROC消息 存储过程中的每个语句。对于存储过程 包含几个不返回太多实际数据的语句,或者包含 包含Transact-SQL循环的过程,将SET NOCOUNT设置为ON 可以提供显着的性能提升,因为网络流量 大大减少了。
这个想法是NOCOUNT
首先使用占位符。稍后您将添加,而不是替换此声明。