2014-08-30 61 views
0

我想使用從過程中的CASE語句回報。它不能是一個函數,因爲該過程返回一個插入的鍵。SQL服務器 - 從個案存儲過程返回結果表達式

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() 

謝謝!

+0

你需要找到實現這個邏輯一些其他的方式。 'update'語句不是正確的方法。也許你需要一個觸發器。 – 2014-08-30 15:33:17

+0

謝謝@GordonLinoff。實際上,它已經在觸發器之內。我試圖避免WHILE循環,並在每次更新#TB_INSERTED_MODIFIED行,但我覺得應該是這樣... = \ – 2014-08-30 15:43:42

+0

使用輸出參數,沒有返回值。返回是用於錯誤和狀態碼,而不是數據。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-using-select-or-return-instead-of-output.aspx – 2014-08-30 19:02:45

回答

0

我無法弄清楚你的表模式以及足以提供一個直接的答案,但我放在一起的方式來更新觸發器內使用插入的標識值。希望你能適應你的具體用例。

看一看這個SQL Fiddle

由於在小提琴的評論中指出,這種策略是基於使用OUTPUT子句捕獲標識值到一個表變量。有關OUTPUT子句的更多信息,請參見http://msdn.microsoft.com/en-us/library/ms177564.aspx

對於大小寫爲true的行,我們在每個真實大小寫中插入一行到輔助表中,並將這些標識捕獲到表變量中,然後使用插入的虛擬表和行之間的行號連接更新基礎表身份表變量。然後我們對案例爲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