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
Was ist ein "Variable"? –
'INSERT INTO @other_table_variable (myVar) SELECT myVar FROM @ Table_Variable'? – plalx
Eine Tabelle, die mit @ beginnt? Dynamisch? Sag mir, wenn ich falsch liege. @Roryap –