【问题标题】:SQL Server - Stored Procedure Return in Case Result ExpressionSQL Server - 案例结果表达式中的存储过程返回
【发布时间】:2014-08-30 15:21:58
【问题描述】:

我想在 CASE 语句中使用来自过程的返回值。它不能是一个函数,因为该过程返回一个插入的键。

    UPDATE TIM 
    SET CD_LINHA_EVENTO = 
        CASE WHEN 
            TIM.CD_SUBESTRUTURA_PARAMETRO = (SELECT TOP 1 SPZ.CD_SUBESTRUTURA_PARAMETRO FROM SUBESTRUTURA_PARAMETRO SPZ WITH (NOLOCK) WHERE SPZ.CD_SUBESTRUTURA = TIM.CD_SUBESTRUTURA 
                                                AND SPZ.FL_SELECAO = 1 ORDER BY SPZ.NR_ORDEM)
            THEN 
                **EXEC [dbo].[SPRTO_NumeracaoEventos]**
            ELSE 
            (SELECT MAX(TIM2.CD_LINHA_EVENTO) FROM #TB_INSERTED_MODIFIED TIM2 WITH(NOLOCK))
            END
    FROM #TB_INSERTED_MODIFIED TIM WITH (NOLOCK)    

存储过程 [SPRTO_NumeracaoEventos]:

INSERT INTO TB_NUMERACAO_EVENTOS (VALOR) VALUES ('')
RETURN SCOPE_IDENTITY()

谢谢!

【问题讨论】:

  • 你需要找到其他方法来实现这个逻辑。 update 声明不是正确的方法。也许你需要一个触发器。
  • 谢谢你,@GordonLinoff。实际上,它已经在触发器中。我试图避免 WHILE 循环并一次更新每个 #TB_INSERTED_MODIFIED 行,但我认为应该是这样... =\
  • 使用 OUTPUT 参数,而不是 RETURN 值。 RETURN 用于错误和状态代码,而不是数据。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…

标签: sql sql-server stored-procedures case procedure


【解决方案1】:

我无法很好地弄清楚您的表架构以提供直接答案,但我整理了一种在更新触发器中使用插入的标识值的方法。希望您可以调整它以适合您的特定用例。

看看这个SQL Fiddle

正如小提琴中的 cmets 所述,此策略基于使用 OUTPUT 子句将标识值捕获到表变量中。有关 OUTPUT 子句的更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms177564.aspx

对于 case 为 true 的行,我们将每个 true case 插入一行到辅助表中,并将标识捕获到表变量中,然后使用插入的虚拟表和标识之间的行号连接更新基础表表变量。然后我们对 case 为 false 的行运行另一个更新。这是我的小提琴示例中的相关触发代码。

-- Create a table variable to hold identity ID values from OUTPUT clause
DECLARE @table_2_ids TABLE (id INT NOT NULL)

-- Insert to our secondary table where the condition is true and capture the identity values to table variable
INSERT table_2 (textval) 
OUTPUT inserted.id INTO @table_2_ids 
SELECT 'from trigger'
FROM inserted
WHERE flag = 1

-- Use row number to match up rows from inserted where the condition is true to the identity value table variable
-- Update matched identity id to underlying table
UPDATE t
SET table_2_id = r.id, textval = textval + ' and trigger inserted to table_2'
FROM table_1 t
JOIN (SELECT id, ROW_NUMBER() OVER (ORDER BY id) rn FROM inserted WHERE flag = 1) i ON i.id = t.id
JOIN (SELECT id, ROW_NUMBER() OVER (ORDER BY id) rn FROM @table_2_ids) r ON r.rn = i.rn

-- and now update where condition is false
UPDATE t
SET textval = textval + ' and trigger did not insert to table_2'
FROM table_1 t
WHERE flag = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多