"SET NOCOUNT ON"是占位符存储过程主体的不错选择吗?

Jon*_*der 6 sql-server stored-procedures

这些答案(1,2),使用代码这篇文章中,建议使用的语句SET NOCOUNT ON作为临时占位符/假体的尸体将很快覆盖的存储过程.

这些答案和那篇文章都没有说明为什么 SET NOCOUNT ON被选为临时存储过程体的值.

我的问题:为什么SET NOCOUNT ON一个临时存储过程体的好选择(如果一切顺利)将在后续操作中被覆盖?还有更好的选择吗?

可能构成一个好的临时/占位符存储过程体的一些标准:

  • 如果由于某种原因ALTER,存储过程的后续操作没有按计划发生,则在运行时以明显的方式失败;
  • 很容易理解未来的开发人员维护存储过程;
  • 不会增加任何重大开销.

Jon*_*der 6

为了更好地满足我的问题中的“标准”,我着手替换SET NOCOUNT ONRAISERROR声明。

我的用于确保存储过程在运行之前的代码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 ...
Run Code Online (Sandbox Code Playgroud)

因此,如果ALTER PROCEDURE以某种方式无法运行,那么如果我的存储过程被执行,它将引发错误,而不是无声地执行任何操作(仅由组成的主体就是这种情况SET NOCOUNT ON)。

感谢这种方法:http : //www.codeofhonor.com/blog/a-better-way-to-update-sql-stored-procedures

  • 制作sproc shell并想确保没有人认为它们已经完成时,通常会引发“未实现”错误。 (2认同)

des*_*ata 5

这可能是因为包括SET NOCOUNT ON;认为是良好的做法.它包含在由SSMS生成的模板SP中.来自NOCOUNT的MSDN文章:

NOCOUNT ON可防止向存储过程中的每个语句发送DONE_IN_PROC消息到客户端.对于包含多个不返回实际数据的语句的存储过程,或者对于包含Transact-SQL循环的过程,将SET NOCOUNT设置为ON可以显着提高性能,因为网络流量大大减少.

这个想法NOCOUNT首先用于占位符.稍后您将添加,而不是替换此语句.