Применение sp_msforeachtable для выбранных таблиц - PullRequest
0 голосов
/ 19 июля 2011

У меня проблема с обновлением некоторых значений столбцов в таблице. В моей базе данных есть много таблиц, из которых я должен обновить те таблицы, в которых есть столбец с именем «Col1».

Если я делаю

exec sp_msforeachtable 'UPDATE ? SET Col1=

case when Col1 = "ppp" then "qqq"
     when Col1 = "aaa" then  "xxx" 
end
' 

Он сообщит об ошибке как

Сообщение 207, Уровень 16, Состояние 1, Строка 1 Неверное имя столбца 'col1'.

Что делать?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Если вы должны использовать sp_msforeachtable, вы можете условно запустить свой код на основе существования вашего столбца.

т.е.

exec sp_msforeachtable '
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMS WHERE COLUMN_NAME =''Col1'' AND TABLE_NAME = ''?'')
BEGIN
    UPDATE ? SET Col1=

    case when Col1 = "ppp" then "qqq"
     when Col1 = "aaa" then  "xxx" 
    end
END 
'

Или, еще лучше:

DECLARE @myScripts TABLE(
                    id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
                    sql VARCHAR(max)
                  )
DECLARE @max INT,
        @i   INT,
        @SQL VARCHAR(MAX)
INSERT INTO @myscripts(sql)
SELECT 'UPDATE [' + tablename + ']  SET Col1=
        case when Col1 = "ppp" then "qqq"
         when Col1 = "aaa" then  "xxx" 
        end'
    FROM [INFORMATION_SCHEMA].TABLES WHERE TABLE_NAME IN ('table1','table2','table3','table4')
SELECT @max = @@ROWCOUNT, @i = 1

WHILE @i <= @max
BEGIN
    SELECT @SQL = Script
    FROM @myScripts
    WHERE ID = @i

    EXEC sp_executesql @statement = @SQL
    SET @i = @i + 1

END 
1 голос
/ 14 сентября 2012
exec sp_msforeachtable 
  @command1=
    '
    BEGIN
        UPDATE ? SET Col1=
            case when Col1 = "ppp" then "qqq"
             when Col1 = "aaa" then  "xxx" 
         END
    END 
    '
  @whereand='AND o.id in (select object_id from sys.columns c where c.name=''Col1'')'

whereand будет фильтровать то, что отправляется команде, поэтому вы можете свободно выполнять команду, зная, что будут ссылаться только на таблицы с Col1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...