【问题标题】:Getting summary of results from another stored procedure从另一个存储过程获取结果摘要
【发布时间】:2013-06-25 22:26:46
【问题描述】:

我有一个复杂的存储过程,它返回一些带有一些计算值的行

SELECT  CalculatedField1 ,
        CalculatedField2 ,
        ...
FROM ...
WHERE CONDITION

这个 sproc(我们称之为 procA)根据 WHERE 条件返回可变数量的行。这工作正常。我现在需要做的是编写一个存储过程来获取这些返回行的摘要。

-- procB
SELECT SUM(CalculatedField1),
SELECT SUM(CalculatedField2),
       ...
FROM (EXEC procA params)

这可能吗?

编辑:创建一个临时表完成了这项工作,但是我在传递输出参数时遇到了问题。

CREATE PROCEDURE [dbo].[sprocB] (@prm INT = NULL OUTPUT)
AS
BEGIN
SET NOCOUNT ON;

    SET @prm = 1

    SELECT Id FROM dbo.AnyTable
END

CREATE PROCEDURE [dbo].[sprocA] (@prm INT = NULL OUTPUT)
AS
BEGIN
SET NOCOUNT ON;

    CREATE TABLE #temp (Id INT)

    INSERT INTO #temp
    EXEC sprocB @prm

    SELECT Id FROM #temp
END

执行:

USE [MyDatabase]
GO

DECLARE @return_value int,
    @prm int

EXEC    @return_value = [dbo].[sprocA]
    @prm = @prm OUTPUT

SELECT  @prm as N'@prm'

SELECT  'Return Value' = @return_value

GO

临时表的结果正常,结果集检索正确,但@pem 值仍为 NULL。

【问题讨论】:

    标签: sql-server-2008 stored-procedures


    【解决方案1】:

    可以,但需要辅助表:

    CREATE PROCEDURE procB
    AS
    
    declare @table table (CalculatedField1 int, CalculatedField12 int)
    
    insert into @table
    EXEC sp_a
    
    select SUM(CalculatedField1), SUM(CalculatedField2)
    from @table
    
    GO
    

    【讨论】:

    • 我的输出参数有问题。请参阅问题中的更新。
    【解决方案2】:

    这可能会做你想做的事:

    创建表 #scratch (CalculatedField1 int, CalculatedField2 int,...)

    插入#scratch (exec procA params)

    从 #scratch 中选择 sum(CalculatedField1), sum(CalculatedField2),...

    删除表#scratch

    【讨论】:

    • 我的输出参数有问题。请参阅问题中的更新。
    • 您需要使用临时表 (#tablename) 而不是表变量 (@tablename)。表变量不能在 INSERT EXEC 或 SELECT INTO 语句中使用。 support.microsoft.com/kb/305977/en-us
    • 嗨,凯瑟琳,我从声明表变量和创建临时表中得到了相同的结果。在这两种情况下,我都得到了数据,但输出参数不起作用。
    • 嗯。好吧,很明显我没有你的存储过程,但我确实写了一个测试,我将一个存储过程执行到另一个存储过程的临时表中,它工作正常。
    • 在临时表中获取结果集没有问题,正如我所说,从输出参数中获取值存在问题。这是我的场景:sprocA 和 sprocB 都具有相同的签名(例如一个输出参数 prm)。在 procA 中,您通过传递传递给 procA 的 prm 来调用 procB(参见我的示例)。 ProcB 返回过滤集,它还为输出参数 (=1) 设置一个值。问题是在 sprocA 完成后,prm 仍将为 null(传递给 procA 时的原始值),尽管我们在 sprocB 中将其设置为 1。如果我从查询窗口调用 procB,@prm 的值为 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多