18

我正在 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 默认为 OFF。是否可以在我的数据库中更改此行为?

4

5 回答 5

25

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

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

于 2009-06-15T11:27:45.603 回答
6

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

于 2009-08-26T18:36:51.847 回答
4

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

您可以在 MSDN 上阅读它。如果代码将被 DataAdapters 使用,那么显然不要使用 SET NOCOUNT ON。

看起来 SqlCommand也有这种行为,我猜这就是 DataAdapter 有问题的原因(因为它会使用 Command 对象)。

于 2009-06-15T11:28:30.173 回答
2

使用 SET NOCOUNT ON/OFF 的原因:

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

于 2011-12-29T10:21:58.077 回答
-1

为什么我们使用 SET NOCOUNT on/off ---

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

第 1 步:执行查询“Select top 10 * from table name”。

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

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

step 4 : By default NOCOUNT is ON then it counts the number of returned rows that is why my suggestion that it should off during creating new procedures to get better performance from database server.

于 2013-12-23T11:10:49.533 回答