2016-05-27 3 views
0

ANOTHER_TABLE.myVar2から選択された値を含めて以下の表の変数@TABEL_VARIABLESQL Server - テーブル変数の値をループする最も簡単な方法は何ですか?例えば

DECLARE @Table_Variable (myVar VARCHAR(MAX)) 

INSERT INTO @Table_Variable (myVar) 
    SELECT myVar2 
    FROM ANOTHER_TABLE 

@Table_Variable.myVarの値をループする最も簡単な方法であり、別のテーブルまたはテーブル変数内に置きますか?

+0

「バリアブル」とは何ですか? –

+3

'INSERT INTO @other_table_variable(myVar)SELECT myVar FROM @ Table_Variable'? – plalx

+0

@で始まる表は?動的?私が間違っているかどうか教えてください。 @roryap –

答えて

1

実際の例を説明します。入れ子になったINSERT EXECに対する制限を克服するために繰り返し使用しました。基本的に、このアプローチでは、C#またはVB.Netの標準For I = 0ループと同様に、テーブル変数をループするためのカウンタをインクリメントします。この特定の例では、各パスで異なるスキーマ、テーブル、および列を選択し、集計を取得し、別のテーブルの値を更新するために使用します。同じアプローチを使用して、ループ内で他の操作を実行し、RBAR更新を実行してINSERT EXECを無効にすることもできます。これは私がそれまでに見つけた最も実用的な使用です。私はコードが改善される方法があると確信しています(私はまた、複数の条件などを処理するためのより洗練されたバージョンを持っています)が、デザインパターンは同じままです。おそらく、セットベースのソリューションがほぼ常に望ましい大規模なクエリではうまく機能しませんが、このアプローチにはニッチな用途があります。私はこれが役立つことを願っていますあなたが何か明確化が必要なら、私に知らせてください。 :)

DECLARE @SQLString nvarchar(max), 
@CurrentTableVarID bigint = 0, 
@MaxTableVarID bigint = 0, 
@CounterCheck bigint = 0, 
@ParameterDefinition nvarchar(500), 
@MaxID bigint, 
@MaxIDOut bigint 

SET @SQLString = '' 

SELECT @MaxTableVarID = Max(ID) FROM @ResultTable GROUP BY ID ORDER BY ID ASC 
SELECT @CurrentTableVarID =Max(ID) FROM @ResultTable GROUP BY ID ORDER BY ID DESC 

WHILE @CurrentTableVarID <= @MaxTableVarID 
BEGIN 

     SELECT @SchemaName = SchemaNAme, @TableName = TableName, 
     @ColumnName = ColumnName 
     FROM @MyTableVar 
     WHERE ID = @CurrentTableVarID 

     SET @ParameterDefinition = '@MaxIDOut bigint OUTPUT'; 
     SET @SQLString = 'SELECT @MaxIDOut = Max(' + @ColumnName + ') FROM [' + @SchemaName + '].[' + @TableName + '] GROUP BY ' + @ColumnName + ' ORDER BY ' + @ColumnName + ' ASC' 

     EXEC sp_executesql @SQLString, @ParameterDefinition, @MaxIDOut = @MaxID OUTPUT 

     UPDATE @ResultTable 
     SET MaxID = @MaxID 
     WHERE ID = @CurrentTableVarID 


    SET  @CounterCheck = @CounterCheck + 1 
    SET @CurrentTableVarID = @CurrentTableVarID + 1 -- increment the loop 
END