9

直升,SQL Server存儲過程存儲返回值

我的問題是我在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

由於您的問題不清楚,您必須向我們展示更多代碼。 – 2009-08-27 15:49:54

+0

我同意..向我們展示整個上下文..調用「其他」存儲過程。 – madcolor 2009-08-27 15:51:02

+0

問題是,返回計數的sproc包含的結果集中包含的數多於此結果,並且此輸出在第二個sproc中出現。 – 2009-08-27 15:55:07

回答

12

您可以將存儲過程的結果捕獲到臨時表中,使其不會被調用存儲過程返回。

create table #temp (id int, val varchar(100)) 
insert into #temp 
exec sp_My_Other_SP @value, @value, @value, @count OUTPUT 
+2

我用這個方法,但是,而不是一個哈希表我使用的表標量類型,如: DECLARE @temp_tbl TABLE(值INT) INSERT INTO @temp_tbl EXEC sp_My_SP \t \t \t SET @count =(SELECT TOP 1值FROM @temp_tbl) – Phil 2009-08-27 16:09:47

+0

由於您選擇了不關心的數據,因此這當然效率較低。如果您只是在尋找一個計數,那麼最好向sp_My_Other_SP添加一個新參數,以控制結果集是否被返回。 – 2009-08-27 21:40:27

+0

這沒有意義,我關心計數,因爲我會一直使用它,它對SP的其他部分至關重要。 – Phil 2009-09-02 14:49:56

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) 

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

雖然此代碼可能會回答問題,但最好解釋它如何解決問題以及爲何使用它。從長遠來看,僅有代碼的答案是沒有用的。 – 2015-11-18 13:17:09