在存储过程中,我需要获取另一个存储过程的结果计数。具体来说,我需要知道它是否返回任何结果,或者是否为空集。
我可以创建一个临时表/表变量,将存储过程放入其中,然后对该数据运行select count。但我真的不关心数据本身,我需要的只是计数(或存在/不存在数据)。我想知道是否有更有效的方法来获取这些信息。
我不想只复制其他存储过程的内容并将其重写为选择计数。存储过程变化太频繁,无法使用。
答案 0 :(得分:3)
那么,根据存储过程的工作方式,@@ ROWCOUNT会返回SP将执行的任何结果的#(包括更新): http://msdn.microsoft.com/en-us/library/ms187316.aspx
只有当您在sp中执行的最后一项操作将行返回到客户端时,这才会起作用...否则您将获得其他语句的结果。有意义吗?
答案 1 :(得分:1)
@@ ROWCOUNT
答案 2 :(得分:1)
使用out参数
答案 3 :(得分:1)
我认为你可以返回行数(使用RETURN)或使用out参数来获取值。
答案 4 :(得分:0)
如果您可以将其他过程重写为返回结果集的简单函数,则只需从中选择count(*)即可。
答案 5 :(得分:0)
似乎是其他人正在改变其他存储过程,无论这些过程发生什么变化,您都需要有效地检查结果。
创建一个诱饵表并将该过程的结果插入其中。
然后,您可以对结果执行行计数。如果我正确理解你的问题,它不是最有效但最可靠的解决方案。
Snipet:
DECLARE @res AS TABLE (
[EmpID] [int] NOT NULL,
[EmpName] [varchar](30) NULL,
[MgrID] [int] NULL
)
INSERT @res
EXEC dbo.ProcFoo
SELECT COUNT(*) FROM @res
答案 6 :(得分:0)
鉴于你真的不需要知道计数,只是你的sproc是否有数据,我建议这样:
CREATE PROCEDURE subProcedure @param1, @param2, @Param3 tinyint OUTPUT
AS
BEGIN
IF EXISTS(SELECT * FROM table1 WHERE we have something to work with)
BEGIN
-- The body of your sproc
SET @Param3 = 1
END
ELSE
SET @Param3 = 0
END
现在你可以执行sproc并检查@Param3的值:
DECLARE @ThereWasData tinyint
exec subProcedure 'foo', 'bar', @ThereWasData OUTPUT
IF @ThereWasData = 1
PRINT 'subProcedure had data'
ELSE
PRINT 'subProcedure had NO data'
答案 7 :(得分:0)
我认为你应该这样做:
Create Procedure [dbo].[GetResult] (
@RowCount BigInt = -1 Output
) As Begin
/*
You can do whatever else you should do here.
*/
Select @RowCount = Count_Big(*)
From dbo.SomeLargeOrSmallTable
Where SomeColumn = 'Somefilters'
;
/*
You can do whatever else you should do here.
*/
--Reporting how your procedure has done the statements. It's just a sample to show you how to work with the procedures. There are many ways for doing these things.
Return @@Error;
End;
写完后你可以得到这样的输出结果:
Declare @RowCount BigInt
, @Result Int
;
Execute @Result = [dbo].[GetResult] @RowCount Out
Select @RowCount
, @Result
;
干杯
答案 8 :(得分:0)
create proc test
as
begin
select top 10 * from customers
end
go
create proc test2 (@n int out)
as
begin
exec test
set @n = @@rowcount
--print @n
end
go
declare @n1 int =0
exec test2 @n1 out
print @n1
--output result: 10