2011-10-20 1 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 

その典型的なループはカウンタによって供給されている操作を行うことができますが、私は1つのクエリになるこの再記述することができ、他の方法はありますか?

+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

ステートメント 'EXECUTE @err = f_rslm_publish @ result_mstr_id'の' WHILE'ループをどのように置き換えますか? –

関連する問題