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



这些答案(1,2),使用本文中的代码,建议使用语句SET NOCOUNT ON作为临时占位符/虚构的主体,用于存储的过程,该过程将很快被覆盖。p>这些答案也不是该文章指定为什么选择 SET NOCOUNT ON作为临时存储过程的值。

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

想到的一些标准可能构成了一个好的临时/占位符存储程序主体:

  • 如果由于某种原因未按计划进行存储过程的后续 ALTER
  • 在运行时很明显失败;
  • 未来的开发人员维护存储程序很容易理解;
  • 没有添加任何重要的开销。

为了更好地满足我的问题的"标准",我已经降落在用 SET NOCOUNT ON替换CC_5语句中。

我的代码以确保在运行 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过程以某种方式无法运行,则如果执行我的存储过程,则会引起错误,而不是无声地做任何事情(就像仅由SET NOCOUNT ON组成的身体一样)。p>以这种方法的荣誉:http://www.codeofhonor.com/blog/a-better-way-to-to-update-sql-sql-sql-stored-procedures

这可能是因为包括SET NOCOUNT ON;被认为是好的实践。它包含在由SSM生成的模板SP中。摘自Nocount上的MSDN文章:

nocount to done_in_proc消息发送给客户端的发送 存储过程中的每个语句。对于存储程序 包含几个没有返回太多实际数据的语句,或 包含Transact-SQL循环的过程,将设置设置为on 可以提供明显的性能提升,因为网络流量 大大减少了。

这个想法是NOCOUNT首先使用了占位符。稍后,您将其添加到而不是替换此语句。

最新更新