2011-10-20 78 views
1

有另一種方式,我可以做下面的查詢我可以在沒有while循環的情況下編寫以下查詢並提高效率嗎?

SELECT @MinID = MIN(ID), @MaxID = MAX(ID) 
FROM #stp 

WHILE (@MinID <= @MaxID AND IsNull(@MaxID, 0) > 0) 
BEGIN 

    SELECT @result_mstr_id = result_mstr_id 
    FROM #stp 
    WHERE ID = @MinID 

    EXECUTE @err = f_rslm_publish @result_mstr_id 

    UPDATE dbo.results 
     SET result_stat_cd = CASE result_stat_cd 
           WHEN 'IP' THEN 'C' 
           WHEN 'IS' THEN 'S' 
           ELSE result_stat_cd 
          END 
    WHERE result_mstr_id = @result_mstr_id 

    SELECT @MinID = @MinID + 1 

END 

其典型的循環由計數器被送入但我能重新寫這是一個查詢?

+2

'f_rslm_publish'做什麼? –

+1

你的示例代碼本來可以簡單得多。 'IF @@ error!= 0 GOTO ERROR'語句是無關緊要和分散注意力的。而'UPDATE'查詢似乎也不相關。如果您編輯問題的標題以表明您的方案的關鍵元素是您正在爲存儲在表格列中的多個值執行存儲過程,那將會很好。 –

+0

抱歉肯尼 - 讓我這樣做 – Rob

回答

0

你不能。如果您需要爲表#stp中的每個ID執行存儲過程f_rslm_publish,則需要使用WHILE循環或遊標。

當然,除非您可以更改存儲過程f_rslm_publish的定義,在這種情況下,很有可能重寫它以接受一系列ID值(並且可能不會將WHILE循環添加到存儲過程代碼)。

+0

我認爲這就是關鍵 - 將結果更改爲發佈以接受一系列ID – Rob

0
WHERE result_mstr_id between @MinId and @Maxid 
+0

如何替換語句'WHILE'循環'EXECUTE @err = f_rslm_publish @ result_mstr_id'? –

相關問題