我需要執行存儲過程並將其標量結果存儲到存儲過程中的局部變量。如何將exec存儲過程的結果設置爲變量?
如何實施?
E.G.
CREATE PROCEDURE [dbo].GetNthNo AS
DECLARE @a INT
DECLARE @d INT
DECLARE @n INT
DECLARE @S INT
SET @S=EXEC spGetNthNo @a,@d,@n
SELECT @S
請幫忙。
我需要執行存儲過程並將其標量結果存儲到存儲過程中的局部變量。如何將exec存儲過程的結果設置爲變量?
如何實施?
E.G.
CREATE PROCEDURE [dbo].GetNthNo AS
DECLARE @a INT
DECLARE @d INT
DECLARE @n INT
DECLARE @S INT
SET @S=EXEC spGetNthNo @a,@d,@n
SELECT @S
請幫忙。
相反的:
SET @S=EXEC spGetNthNo @a,@d,@n
您需要:
EXEC @S = spGetNthNo @a,@d,@n
然後在過程中,你需要的東西,如:
RETURN 100
或:
RETURN @x
獲取過程執行後您想要的@S值。
您也可以使用輸出參數。結合示例:
IF OBJECT_ID('tempdb..#example') IS NOT NULL DROP PROCEDURE #example
GO
CREATE PROCEDURE #example
@output_param INT OUTPUT
AS BEGIN
SET @output_param = 100
RETURN 200
END
GO
DECLARE @return INT, @param INT
EXEC @return = #example @output_param = @param OUTPUT
SELECT @return as [return value], @param as [output parameter]
我認爲需要注意的是,如果您在存儲過程中選擇了「值」而不是「返回」值,則會發現父過程實際上會返回基於「EXEC」的值,並且不會將其分配給變量。例如,如果spGetNthNo選擇200而不是返回200,則@S將爲0(缺省值),並且父/包裝過程將返回200(由於EXEC)以及0(作爲從@S)。 – alan 2012-10-19 15:25:19
嘗試類似的東西
CREATE PROCEDURE Test
@RetVal INT OUT
AS
BEGIN
SET @RetVal = 99
END
DECLARE @X INT
EXEC Test @X OUT
PRINT @X
編輯:[評論於有關T-SQL代碼片段的發佈]
你似乎需要一個包裝,圍繞spGetNthNo存儲過程,也許是因爲這個現有的程序不會以所需的方式返回結果。包裝器的一個替代方案可能只是簡單地修改spGetNthNo本身,所以它首先按照需要工作(假定該方法目前沒有與其現有API一起使用)。
不管變化是否會在原來SP或在一個包裝中,有兩個不同的從一個SP檢索數據的方法:
使用輸出變量方法,數據很容易在SP返回時放入變量中。通過記錄集合,調用邏輯需要「消耗」返回的數據,與SELECT語句中的方式類似。
除了消耗返回的數據的方式,還有這些方法之間的一些差異。
最明顯的是「記錄集」方法允許返回更多值:必須明確聲明30個變量(帶有一些旨在幫助表的二維性質的命名約定)來模擬「SELECT TOP 10 a,b,c FROM myTable」的SP的回報。另外,SP將不得不明確地設置這些輸出變量中的每一個。
另一個相關但更微妙的區別是,記錄集方法允許返回在調用時未定義的多個行和列。變量的數量和類型不需要預先表示,而是與記錄集周圍的元數據一起提供。
簡而言之:輸出變量方法更適合於返回固定的一組變量,如狀態碼,最大或最小值(或其他總計值和計算)或幾個字段來自預期的單一記錄。當存儲過程的目的是爲了有效地提供一個類似於表的結果,或者它返回非常多的值時,Recordset方法被使用,比如一個長的和不斷髮展的聚集值列表等。
您能告訴我們至少有部分存儲過程嗎?你在存儲過程中做了什麼? – 2009-10-22 05:56:49
我們需要查看存儲過程,或者至少一些示例代碼。 – mrdenny 2009-10-22 06:04:35