2011-07-10 106 views
2

我知道從存儲過程返回標量值的首選方法是使用RETURNOUTPUT參數。但讓說,我有一個存儲過程,使用select語句返回值:從存儲過程中的SELECT語句中獲取標量值,從存儲過程中獲得

CREATE PROC spReturnNumber AS 

SELECT 1 

是否可以從另一個存儲過程中得到這個值?

CREATE PROC spCheckNumber AS 

EXEC spReturnNumber -- <-- get the return value here? 

澄清:我需要不需要使用OUTPUT參數,或使用RETURN返回值的解決方案。

在此先感謝。

+0

我不使用SQL服務器,所以我不能具體回答,但對於PostgreSQL,答案是**是**。我會想象在這裏也是如此......但它應該很容易測試。 :)事實上,可能比發佈問題更容易(假設_you_有權訪問sql-server) – Flimzy

+0

小心分享如何在PostgreSQL中執行此操作? –

回答

6

你可以使用insert-exec將結果存儲的存儲過程中的表:

declare @t table (col1 int) 
insert @t exec spReturnNumber 
return (select col1 from @t) 

表的定義有相匹配的結果集的存儲過程。

0

你不能從「父」過程中的SELECT價值,但你能得到的返回值是這樣的:

CREATE PROC A AS 
BEGIN 
    DECLARE @ret int 

    EXEC @ret = spReturnNumber 

    RETURN @ret 
END 
+0

我認爲這隻適用於你「返回」的值? –

+0

是的,你只能得到RETURN值,沒有別的。 –

+0

是的,它只有在你返回值的時候才起作用,你不應該對數據使用'RETURN',僅僅爲了錯誤代碼/狀態。 –

1

使用,而不是(或除了一個OUTPUT參數,如果這個過程是由其他應用程序使用)SELECT

ALTER PROCEDURE dbo.spReturnNumber 
    @Number INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @Number = 1; 
    SELECT @Number; 
END 
GO 

CREATE PROCEDURE dbo.spCheckNumber 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @Number INT; 
    EXEC dbo.spReturnNumber @Number = @Number; 
    SELECT @Number; 
END 
GO 

如果您不能更改原始過程,但您知道其輸出將保持靜態,您可以使用#temp表。

CREATE PROCEDURE dbo.spCheckNumber 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #n(i INT); 
    INSERT #n(i) EXEC dbo.spReturnNumber; 

    DECLARE @Number INT; 
    SELECT @Number = i FROM #n; 
END 
GO 
+0

謝謝,但我需要一個不需要更改源存儲過程('spReturnNumber')的解決方案。它所做的就是使用「SELECT」返回標量。 –

+0

您應該聲明,作爲問題的一部分,因爲您將得到的大部分建議將*涉及更改源存儲過程。通過使用#temp表或其他方式在調用者中處理這個問題的效率要低得多。 –

+0

對不起,我認爲第一句話已經涵蓋了我已經考慮過使用'OUTPUT'和'RETURN'。但我更新了OP,以澄清。 –

0

根據OP的請求,使用PostgreSQL的方式來做到這一點。第一個函數foo()只是返回一個INT。以下功能分別爲:bar()baz()分別在直接SQL和PL/pgSQL中調用foo()

CREATE FUNCTION foo() RETURNS INT AS $$ 
    SELECT 1 
$$ LANGUAGE sql; 

CREATE FUNCTION bar() RETURNS INT AS $$ 
    SELECT foo() 
$$ LANGUAGE sql; 

CREATE FUNCTION baz() RETURNS INT AS $$ 
DECLARE 
    x INT; 
BEGIN 
    SELECT INTO x foo(); 
    RETURN x; 
END 
$$ LANGUAGE plpgsql; 

db=# SELECT foo(); 
foo 
----- 
1 
(1 row) 

db=# SELECT bar(); 
bar 
----- 
1 
(1 row) 

db=# select baz(); 
baz 
----- 
1 
(1 row) 
+0

是的,我不認爲這將工作w/SQL Server。這看起來與在SQL Server中使用「RETURN」同義。不過謝謝。 –

+0

無賴。我試過了。 :(祝你好運 – Flimzy

+0

如何在SQL Server的存儲過程的變量中捕獲標準SELECT的輸出?難道你不能做同樣的事情來捕獲存儲過程的輸出嗎? – Flimzy

0

如果無法改變PROC被稱爲..結果放在一個臨時表[或表變量]設置:

CREATE TABLE #results (val INT) 
    DECLARE @someval int 
    INSERT #results 
    EXEC dbo.spCheckNumber 

    SELECT @someval =val from #results