这些答案(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
首先使用了占位符。稍后,您将其添加到而不是替换此语句。