是"设置NOCOUNT ON"占位符存储过程体的一个很好的选择?

时间:2016-11-28 16:43:18

标签: sql-server stored-procedures

这些答案(12)使用this article中的代码,建议使用语句SET NOCOUNT ON作为临时占位符/虚拟主体,用于存储过程的正文将很快被覆盖。

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

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

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

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

2 个答案:

答案 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首先使用占位符。稍后您将添加,而不是替换此声明。