2016-07-23 23 views
0

@proc_nameテーブル変数には、プロシージャ名が格納されており、動的SQLを使用してパラメータを渡しています。私は@proc_nameのすべての行をループするwhileループを使用しています。パフォーマンスを向上させるためにここでCTEを使用できますか?CTEで繰り返し実行する

SELECT * 
FROM @proc_name 

WHILE (@count <= @max) 
BEGIN 
    SET @proc_exec = 'usp_Balance_' 
     +Replace((SELECT Description FROM @proc_name WHERE rn= @count),' ','')+' '+' '+'''' 
     +Replace((SELECT TellerID FROM @proc_name WHERE rn= @count),' ','')+''''+' ,'+'''' 
      [email protected]+''''+' , '+''''+cONvert(VARCHAR(100),@BusinessDate)+'''' 

    -- Update TDrawerSummary 
    PRINT (@proc_exec) 

    SET @count = @count + 1 
END 

ありがとうございます。

DECLARE c CURSOR FOR 
    SELECT 'usp_Balance_' 
      +Replace(Description,' ','')+' '+' '+'''' 
      +Replace(TellerID,' ','')+''''+' ,'+'''' 
       [email protected]+''''+' , '+''''+cONvert(VARCHAR(100),@BusinessDate)+'''' 
    FROM @proc_name 
    ORDER BY rn 
OPEN c 
FETCH c INTO @proc_exec 
WHILE @@FETCH_STATUS=0 
    BEGIN 
     -- Update TDrawerSummary 
     PRINT @proc_exec 
     FETCH c INTO @proc_exec 
    END 
CLOSE c 
DEALLOCATE c 

クエリに手続き型コードを変えるのを助けるためにCTEを使用することができますいくつかのケースでは:で始まる以下に示すようにカーソルでWHILEループを置き換えるために

+0

これほど多くは改善できませんが、完全に理解するのは難しいでしょう。 '@ proc_name'の各レコードに対してストアドプロシージャを実行するために'動的SQL 'が必要なのは確実ですか?そのストアドプロシージャで実際に何が起こるのですか? – sgeddes

+1

(SQL Serverの)CTEはパフォーマンスを向上させません。彼らは、クエリを理解しやすくします。 –

+0

@ GordonLinoff - パフォーマンスを向上させました。一意であり、cteのインデックスに含まれる大きなテーブルから小さなフィールドセットを選択し、残りの列を取得するためにテーブルに再び参加します。 – Hogan

答えて

2

。これによりパフォーマンスが向上する可能性があります。 @proc_nameを構築しているコードを共有することができれば、可能性があるかどうかを確認することができます。

カーソルの内側には、エラーを追跡するのに役立ついくつかの措置を取ることを検討する必要があります。現在のコードでは、どの反復でエラーが発生したかを知ることは非常に難しいでしょう。簡単な例を以下に示します。

BEGIN TRY 
     -- Update TDrawerSummary 
     PRINT @proc_exec 
    END TRY 
    BEGIN CATCH 
     PRINT 'Failed executing '+COALESCE(@proc_exec,'(null)')+': '+ERROR_MESSAGE() 
    END CATCH 
+0

私の提案の非常に良いコード例。いい答えだ! – Hogan

関連する問題