2011-07-10 79 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