从存储过程中的SELECT语句中获取标量值

时间:2011-07-10 12:32:28

标签: sql sql-server stored-procedures

我知道从存储过程中返回标量值的首选方法是使用RETURNOUTPUT参数。但是,假设我有一个存储过程,它使用select语句返回值:

CREATE PROC spReturnNumber AS

SELECT 1

是否可以从另一个存储过程中获取此值?

CREATE PROC spCheckNumber AS

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

澄清:我需要一个不需要使用OUTPUT参数或使用RETURN返回值的解决方案。

提前致谢。

5 个答案:

答案 0 :(得分:6)

您可以使用insert-exec将存储过程的结果存储在表中:

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

表的定义必须与存储过程的结果集匹配。

答案 1 :(得分: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

答案 2 :(得分:0)

您无法从“父”程序中获取SELECT值,但您可以像这样获得返回值:

CREATE PROC A AS
BEGIN
    DECLARE @ret int

    EXEC @ret = spReturnNumber

    RETURN @ret
END

答案 3 :(得分: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)

答案 4 :(得分:0)

如果您无法更改被调用的proc ..将结果集放在临时表[或表变量]中:

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

   SELECT @someval =val from  #results