2009-06-15 73 views
16

我在Sql Server 2008数据库中创建一个存储过程。我想返回受影响的行数。哪一个更好的选择SET NOCOUNT OFF或RETURN @@ ROWCOUNT?SET NOCOUNT OFF或RETURN @@ ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

我知道这两个工作,但哪一个是更好的选择,为什么?


经过一番尝试,我得出的结论是SET NOCOUNT在默认情况下在存储过程中是关闭的。是否有可能改变我的数据库内的这种行为?

回答

23

使用@@ RowCount。它明确且透明,完全由代码控制,而不是内置行为。

NOCOUNT选项可手动设置为ON(Optons> Query Execution> SQL Server> Advanced)。如果以这种方式设置,但在存储过程中声明SET NOCOUNT OFF,则该本地设置优先。

4

我知道SET NOCOUNT ON会让DataAdapter认为存在并发冲突。您可以使用read about it on MSDN。如果代码将被DataAdapter使用,那么显然不要使用SET NOCOUNT ON。

它看起来像SqlCommand also has this behaviour,我猜是DataAdapter有问题(因为它下面会使用Command对象)的原因。

+0

我没有在SqlCommand文档中看到有关SET NOCOUNT的任何提及。你确定存在与DataAdapter相同的问题吗? – niaher 2009-06-15 11:52:57

+1

谷歌它 - 你会发现它有很多证据:http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=en&q=ExecuteNonQuery+ NOCOUNT&元= btnG =谷歌+搜索。我无法确定它与DataAdapter没有经过测试的问题相同,但我不明白为什么会有其他原因。 – RichardOD 2009-06-15 12:00:00

5

不要对值使用RETURN。按照约定从存储过程返回的是错误代码,0表示没有错误,非0表示某种问题。如果需要返回数据,则使用OUTPUT参数进行此操作的适当方式。基于其他语言对回报的使用,这有点违反直觉。

2

原因使用SET NOCOUNT ON/OFF:

为了控制堆栈溢出,同时将行插入的任何表。 在执行查询或嵌套查询时传递T-Sql消息。 显示或查看执行的最新查询。 获取有关最新记录升级的信息。

0

为什么我们使用开/关---

答SET NOCOUNT:我们可以通过以下步骤

第1步明白这一点:执行查询 “选择顶层10 * from表名” 。

步骤2:打开消息窗口,显示消息“10 rows affected”。它会产生额外的开销并延长我们的执行时间。

第3步:为了克服这个额外的开销,我们使用SET NOCOUNT ON。如果它是On,那么它将永远不会计算行返回的数量,而是播放一条消息命令成功完成。

步骤4:默认情况下,NOCOUNT为ON,那么它会计算返回的行数,这就是为什么我建议在创建新过程期间应该关闭它以便从数据库服务器获得更好性能。