実際の例を説明します。入れ子になった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
「バリアブル」とは何ですか? –
'INSERT INTO @other_table_variable(myVar)SELECT myVar FROM @ Table_Variable'? – plalx
@で始まる表は?動的?私が間違っているかどうか教えてください。 @roryap –