在tsql中我正在调用一个返回记录集的tsql存储过程。我希望能够判断记录集是空还是非空。
出于某种原因@@ rowcount总是返回1.
最好的方法是什么?
还有一件事我无法编辑这个存储过程。
答案 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: 执行存储过程后。