2016-05-27 3 views
0

Например, таблица переменные @TABEL_VARIABLE ниже, включая значение, выбранное из ANOTHER_TABLE.myVar2:SQL Server - Каков самый простой способ перебрать значения переменной таблицы?

DECLARE @Table_Variable (myVar VARCHAR(MAX)) 

INSERT INTO @Table_Variable (myVar) 
    SELECT myVar2 
    FROM ANOTHER_TABLE 

Что это самый простой способ проходных значений в @Table_Variable.myVar и поместить их в другой таблице или таблице переменной?

+0

Что такое «variabel»? –

+3

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

+0

Стол, начинающийся с @? Динамический? Скажи мне, если я ошибаюсь. @roryap –

ответ

1

Позвольте мне привести практический пример, который я использовал повторно, чтобы победить ограничение против вложенных 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 
Смежные вопросы