我知道从存储过程中返回标量值的首选方法是使用RETURN
或OUTPUT
参数。但是,假设我有一个存储过程,它使用select语句返回值:
CREATE PROC spReturnNumber AS
SELECT 1
是否可以从另一个存储过程中获取此值?
CREATE PROC spCheckNumber AS
EXEC spReturnNumber -- <-- get the return value here?
澄清:我需要一个不需要使用OUTPUT
参数或使用RETURN
返回值的解决方案。
提前致谢。
答案 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