在存储过程中,我需要获取另一个存储过程的结果计数。具体来说,我需要知道它是否返回任何结果或一个空集。
我可以创建一个临时表/表变量,将存储过程执行到其中,然后对该数据运行选择计数。但我真的不关心数据本身,我需要的只是计数(或数据的存在/不存在)。我想知道是否有更有效的方法来获取这些信息。
我不想只复制其他存储过程的内容并将其重写为选择计数。存储过程更改太频繁以至于无法使用。
在存储过程中,我需要获取另一个存储过程的结果计数。具体来说,我需要知道它是否返回任何结果或一个空集。
我可以创建一个临时表/表变量,将存储过程执行到其中,然后对该数据运行选择计数。但我真的不关心数据本身,我需要的只是计数(或数据的存在/不存在)。我想知道是否有更有效的方法来获取这些信息。
我不想只复制其他存储过程的内容并将其重写为选择计数。存储过程更改太频繁以至于无法使用。
好吧,根据存储过程的工作方式,@@ROWCOUNT 返回 SP 将执行的任何操作(包括更新)的结果数:http: //msdn.microsoft.com/en-us/library/ms187316.aspx
这仅在您在 sp 中执行的最后一件事是将行返回给客户端时才有效……否则您将获得其他语句的结果。说得通?
@@ROWCOUNT
使用输出参数
我认为您可以返回行数(使用 RETURN)或使用 out 参数来获取值。
如果您可以将其他过程重写为返回结果集的简单函数,则可以简单地从中选择 count(*)。
似乎是其他人更改了其他存储过程,无论对此类过程进行更改,您都需要一些东西来有效地检查结果。
创建一个 tempt 表并将该过程的结果插入其中。
然后您可以对结果执行行计数。如果我正确理解您的问题,这不是最有效但最可靠的解决方案。
片段:
DECLARE @res AS TABLE (
[EmpID] [int] NOT NULL,
[EmpName] [varchar](30) NULL,
[MgrID] [int] NULL
)
INSERT @res
EXEC dbo.ProcFoo
SELECT COUNT(*) FROM @res
我认为你应该这样做:
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
;
干杯
鉴于您实际上并不需要知道计数,而只需要知道您的 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
现在您可以执行存储过程并检查@Param3 的值:
DECLARE @ThereWasData tinyint
exec subProcedure 'foo', 'bar', @ThereWasData OUTPUT
IF @ThereWasData = 1
PRINT 'subProcedure had data'
ELSE
PRINT 'subProcedure had NO data'
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