Реализация цикла for в SQL для обновления строк

#sql #sql-server #tsql #sql-server-2008

#sql #sql-сервер #tsql #sql-server-2008

Вопрос:

Как мне написать приведенный ниже код в SQL? Запрос обновит каждый столбец в таблице на основе результата.

 DECLARE @table_list NVARCHAR -- What data type do I use to hold a list?
DECLARE @column_list NVARCHAR

SET @table_list = (SELECT DISTINCT [ID_TABLE_NAME] FROM dbo.VMO) -- there are more than one results 
SET @column_list = (SELECT DISTINCT [USR_COL_NAME] FROM dbo.VMO) -- there are more than one results 

foreach(@table IN @table_list)
{
    foreach(@column IN @column_list)
    {
        UPDATE @table
        SET @column = '101211'
        WHERE @column = '10120'
    }
}
  

Комментарии:

1. Что вы хотите сделать тогда? Вы хотите SELECT создать новый список таблиц?

2. Кроме того, я не понимаю цели операции, выполняемой внутри цикла. Не могли бы вы, пожалуйста, подробнее сформулировать свой вопрос?

3. Я не думаю, что T-SQL поддерживает цикл for, возможно, у него есть цикл WHILE

Ответ №1:

Вы можете использовать курсоры, чтобы действовать как цикл foreach:

 DECLARE @table NVARCHAR(255)
DECLARE @column NVARCHAR(255)

DECLARE OUTER_CURSOR CURSOR 
FOR SELECT DISTINCT [ID_TABLE_NAME] FROM dbo.VMO

OPEN OUTER_CURSOR 

FETCH NEXT FROM OUTER_CURSOR INTO @table
WHILE (@@FETCH_STATUS <> -1)
BEGIN

        DECLARE INNER_CURSOR CURSOR 
        FOR SELECT DISTINCT [USR_COL_NAME] FROM dbo.VMO

        OPEN INNER_CURSOR 

        FETCH NEXT FROM INNER_CURSOR INTO @column

        WHILE (@@FETCH_STATUS <> -1)
        BEGIN


            DECLARE @strQuery NVARCHAR(MAX) 
            SET @strQuery = 'UPDATE ['   @table   '] SET ['   @column   '] = ''101211'' WHERE ['   @column   '] = ''10120'';'

            EXEC(@strQUERY)

            FETCH NEXT FROM INNER_CURSOR INTO @column

        END

        CLOSE INNER_CURSOR
        DEALLOCATE INNER_CURSOR

FETCH NEXT FROM OUTER_CURSOR INTO @table

END

CLOSE OUTER_CURSOR
DEALLOCATE OUTER_CURSOR
  

Ответ №2:

В T-SQL нет FOR loop , возможно, у него есть WHILE (Transact-SQL)

Используйте SQL, как показано ниже:

 DECLARE @table_list NVARCHAR -- What data type do I use to hold a list?
DECLARE @column_list NVARCHAR

SET @table_list = (SELECT DISTINCT [ID_TABLE_NAME] FROM dbo.VMO) -- there are more than one results 
SET @column_list = (SELECT DISTINCT [USR_COL_NAME] FROM dbo.VMO) -- there are more than one results 

WHILE @column_list > @table_list
BEGIN
  UPDATE @table
        SET @column = '101211'
        WHERE @column = '10120'
END;