例如下面的表变量@TABEL_VARIABLE
,包括从ANOTHER_TABLE.myVar2
中选择的值:
DECLARE @Table_Variable (myVar VARCHAR(MAX))
INSERT INTO @Table_Variable (myVar)
SELECT myVar2
FROM ANOTHER_TABLE
循环查看@Table_Variable.myVar
中的值并将它们放在另一个表或表变量中的最简单方法是什么?
答案 0 :(得分: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