2016-05-27 7 views
0

Zum Beispiel die Tabellenvariable @TABEL_VARIABLE unter Einbeziehung der von ANOTHER_TABLE.myVar2 ausgewählten Werte:SQL Server - Wie können Sie die Werte einer Tabellenvariablen am einfachsten durchlaufen?

DECLARE @Table_Variable (myVar VARCHAR(MAX)) 

INSERT INTO @Table_Variable (myVar) 
    SELECT myVar2 
    FROM ANOTHER_TABLE 

Was ist der einfachste Weg, um durch die Werte in @Table_Variable.myVar Schleife und legen Sie sie in einer anderen Tabelle oder Tabellenvariable?

+0

Was ist ein "Variable"? –

+3

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

+0

Eine Tabelle, die mit @ beginnt? Dynamisch? Sag mir, wenn ich falsch liege. @Roryap –

Antwort

1

Lassen Sie mich ein praktisches Beispiel geben, das ich wiederholt verwendet habe, um die Beschränkung auf verschachtelte INSERT EXECs zu überwinden. Im Grunde erhöht dieser Ansatz nur einen Zähler zur Schleife über eine Tabellenvariable, ähnlich wie in einem Standard For I = 0-Schleife in C# oder VB.Net. In diesem speziellen Beispiel verwende ich es, um bei jedem Durchlauf ein anderes Schema, eine andere Tabelle und eine andere Spalte auszuwählen und ein Aggregat abzurufen, das dann verwendet wird, um Werte in einer anderen Tabelle zu aktualisieren. Sie können den gleichen Ansatz verwenden, um andere Operationen in der Schleife auszuführen, zusätzlich zu einer RBAR-Aktualisierung, um INSERT EXEC zu besiegen; Dies ist der praktischste Gebrauch, den ich bisher gefunden habe. Ich bin mir sicher, dass es Möglichkeiten gibt, wie der Code verbessert werden kann (ich habe auch komplexere Versionen, um mehrere Bedingungen zu behandeln, etc.), aber das Designmuster bleibt gleich. Es wird wahrscheinlich nicht gut bei großen Abfragen, wo Set-basierte Lösungen sind fast immer vorzuziehen, aber es gibt Nischen verwendet für diesen Ansatz. Ich hoffe das hilft; Wenn Sie irgendwelche Klärungen etc. benötigen, lassen Sie es mich bitte wissen. :)

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 
Verwandte Themen