如何判断Sql Server存储过程是否返回记录

时间:2011-02-21 20:10:21

标签: sql-server-2005 tsql

在tsql中我正在调用一个返回记录集的tsql存储过程。我希望能够判断记录集是空还是非空。

出于某种原因@@ rowcount总是返回1.

最好的方法是什么?

还有一件事我无法编辑这个存储过程。

4 个答案:

答案 0 :(得分:4)

在内部存储过程中使用@@ rowcount,作为输出参数传回。 在内部存储过程中的SELECT之后立即使用@@ rowcount 。并且这样打电话:

EXEC dbo.InnerProc @p1, ..., @rtncount OUTPUT

...或

在SELECT之后立即在内部存储过程中使用RETURN @@ rowcount 。并且这样打电话:

EXEC @rtncount = dbo.InnerProc @p1, ...

编辑:

如果您无法编辑proc,则必须加载临时表并对其进行操作。

CREATE TABLE #foo (bar int...)

INSERT #foo
EXEC MyUntouchableProc @p1
SELECT @@ROWCOUNT

@@ ROWCOUNT失败,因为它只显示最后一个语句计数,而不是最后一个SELECT。它可以是RETURN,END(在某些情况下),SET等

答案 1 :(得分:2)

使用@@ ROWCOUNT

来自msdn:

返回最后一个语句影响的行数。如果行数超过20亿,请使用ROWCOUNT_BIG。

以下是一个例子:

USE AdventureWorks2008R2;
GO
UPDATE HumanResources.Employee 
SET JobTitle = N'Executive'
WHERE NationalIDNumber = 123456789
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
ELSE
PRINT @@ROWCOUNT + ' records updated';
GO

如果您使用.net并使用SqlDataReader,则可以使用.HasRows方法或这些记录的.count。您可以做的另一件事是将输出参数传递给您的sproc,将值存储在您的sproc中的out参数中。然后,当您返回.net时,您将获得此值(受sproc影响的记录数)。

来自MSDN:

  

说明简单的陈述   赋值总是设置@@ ROWCOUNT   值为1.没有行发送到   客户。这些陈述的例子   是:SET @local_variable,RETURN,   READTEXT,并选择不查询   诸如SELECT GETDATE()或。之类的语句   选择'通用文字'。

另请确保SET NOCOUNT ON

答案 2 :(得分:1)

修改

您想在SELECT语句后立即计算@@ rowcount。如果两者之间发生任何事情,将为每个新语句更新@@ rowcount。您可以在存储过程中评估@@ rowcount并将其作为输出参数传回。

修改

另请确保SET NOCOUNT ON

或者

对存储过程中的基础数据集运行select count(*) from...。你可以把它作为输出参数吐出来。

答案 3 :(得分:1)

选择@@ rowcount: 执行存储过程后。