SET NOCOUNT OFF或RETURN @@ ROWCOUNT?

时间:2009-06-15 11:23:19

标签: sql sql-server tsql rowcount nocount

我正在Sql Server 2008数据库中创建一个存储过程。我想返回受影响的行数。哪个是更好的选择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在存储过程中处于关闭状态。是否可以在我的数据库中更改此行为?

5 个答案:

答案 0 :(得分:24)

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

NOCOUNT选项可以手动设置为默认为ON(选项>查询执行> SQL Server>高级)。如果以这种方式设置,但随后在存储过程中声明SET NOCOUNT OFF,则该本地设置优先。

答案 1 :(得分:5)

不要将RETURN用于值。按照惯例,来自存储过程的RETURN用于错误代码,0表示没有错误,非0表示某种问题。如果需要返回数据,则使用OUTPUT参数的相应方法。基于其他语言对回归的使用,这有点违反直觉。

答案 2 :(得分:4)

我知道让SET NOCOUNT ON会使DataAdapter认为存在并发冲突。

你可以read about it on MSDN。如果DataAdapters将使用该代码,那么显然不要使用SET NOCOUNT ON。

它看起来像SqlCommand also has this behaviour,我猜这是DataAdapter出现问题的原因(因为它将使用Command对象)。

答案 3 :(得分:2)

使用SET NOCOUNT ON / OFF的原因:

  

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

答案 4 :(得分:0)

为什么我们开启/关闭SET NOCOUNT ---

Ans:我们可以通过以下步骤理解这一点

步骤1:执行查询“从表名中选择前10 *。”

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

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

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