SQL Server - 循环表变量值的最简单方法是什么?

时间:2016-05-27 21:35:46

标签: sql sql-server tsql

例如下面的表变量@TABEL_VARIABLE,包括从ANOTHER_TABLE.myVar2中选择的值:

DECLARE @Table_Variable (myVar VARCHAR(MAX)) 

INSERT INTO @Table_Variable (myVar)
    SELECT myVar2 
    FROM ANOTHER_TABLE 

循环查看@Table_Variable.myVar中的值并将它们放在另一个表或表变量中的最简单方法是什么?

1 个答案:

答案 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 
相关问题