Позвольте мне привести практический пример, который я использовал повторно, чтобы победить ограничение против вложенных INSERT EXEC. В принципе, этот подход просто увеличивает счетчик на цикл по переменной таблицы, как и в стандартном для цикла I = 0 в C# или VB.Net. В этом конкретном примере я использую его для выбора другой схемы, таблицы и столбца на каждом проходе и получения совокупности, которая затем используется для значений UPDATE в другой таблице. Вы можете использовать тот же подход для выполнения других операций в цикле, кроме выполнения обновления 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
Что такое «variabel»? –
'INSERT INTO @other_table_variable (myVar) SELECT myVar FROM @ Table_Variable'? – plalx
Стол, начинающийся с @? Динамический? Скажи мне, если я ошибаюсь. @roryap –