SQL Server 存储过程存储返回值。

9

你好,

我的问题是我有一个在SQL Server中返回字段计数的存储过程。我想将这个存储过程的结果存储到另一个存储过程的变量(标量?)中。

sp_My_Other_SP:

CREATE PROCEDURE [dbo].sp_My_Other_SP
@variable int OUTPUT -- The returned count
AS

BEGIN -- SP

SET NOCOUNT ON;

SET @SQL = "SELECT COUNT(*) FROM blah"
EXEC(@SQL)

END -- SP

我目前这样做:

我目前的做法是:

DECLARE @count int

EXEC sp_My_Other_SP @count OUTPUT

然后我像这样使用它:
IF (@count > 0)
BEGIN
...
END

然而,它返回了其他存储过程的结果以及主存储过程的结果,这在我的.NET应用程序中是一个问题。

-----------
NoColName
-----------
14

-----------
MyCol
-----------
abc
cde
efg

(上面是结果集的尝试表示)

我想知道是否有一种方法可以将存储过程的结果存储到一个变量中,而不输出它。

感谢任何帮助。


2
由于你的问题不清楚,你需要展示更多的代码。 - Mladen Prajdic
我同意。请展示整个上下文,包括对“其他”存储过程的调用。 - madcolor
问题在于返回计数的存储过程包含了更多的结果集,而这个输出结果出现在第二个存储过程中。 - OMG Ponies
4个回答

13
您可以将存储过程的结果捕获到一个临时表中,这样它就不会被调用存储过程返回。
create table #temp (id int, val varchar(100))
insert into #temp
exec sp_My_Other_SP @value, @value, @value, @count OUTPUT

2
我使用了这种方法,但是与哈希表不同,我使用了TABLE标量类型,如下所示:DECLARE @temp_tbl TABLE( value int )INSERT INTO @temp_tbl EXEC sp_My_SPSET @count = (SELECT TOP 1 value FROM @temp_tbl) - Phil
当然,这样做效率会降低,因为你选择了不关心的数据。如果你只是想要一个计数,最好在sp_My_Other_SP中添加一个新参数来控制是否返回结果集。 - Dave Carlile
这没有意义,我关心计数,因为我将总是使用它并且它对于其余存储过程至关重要。 - Phil

4

好的,最简单的解决方法是重新编写存储过程,使得返回“其他”结果集的select语句在此情况下仅在您不要求计数时有条件地执行。

添加另一个名为@GetCount的参数。

@GetCount TinyInt Defualt = 0 // or
@GetCount Bit Default = 0 

然后,不仅仅是


Select ...

编写

   If @GetCount = 1
     Select ...

2

你尝试过更改吗?

SET @SQL = "SELECT COUNT(*) FROM blah" 
EXEC(@SQL) 

to

SELECT @variable = COUNT(*) FROM blah" 
-- don't do EXEC(@SQL) 

?


0
THE FIRST PROCEDURE:
CREATE PROC DD43
@ID INT OUTPUT AS
(SELECT @ID=COUNT(*) FROM CS2)

SECOND PROCEDURE:

 CREATE PROC DD45 AS
 DECLARE @COUNT INT
 DECLARE @COUN INT
 EXEC DD43 @COUN OUT --CALLING THE FIRST PROCEDURE
 SET @COUNT= (SELECT @COUN)
 SELECT @COUNT

 EXEC DD45 

2
虽然这段代码可能回答了问题,但最好解释一下它是如何解决问题以及为什么要使用它。仅有代码的答案从长远来看并不实用。 - Tobias Liefke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接