MS SQL обновляет один и тот же столбец в нескольких таблицах с помощью курсора - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть база данных, содержащая множество таблиц, большинство из которых имеет столбец с именем contract, который является varchar (255) и используется в качестве внешнего ключа. Следующий запрос выбирает все имена таблиц, которые содержат этот столбец (всего 33):

SELECT name FROM sys.objects WHERE object_id IN (
    SELECT object_id FROM sys.columns WHERE Name = N'contract'
) AND name <> N'sysdercv'

Теперь мне нужно изменить все имена контрактов (не многие) на анонимные идентификаторы, чтобы я мог использовать снимки экрана без раскрытия конфиденциальных данных, но мне нужно поддерживать отношения, чтобы приложение продолжало работать. По сути, я хочу изменить все экземпляры contract = 'SomeCompany' на contract = 'example1' во всех таблицах, возвращаемых вышеуказанным запросом.

Моя первоначальная попытка сделать это выглядит следующим образом:

declare @tablename sysname

declare C cursor fast_forward for
SELECT name FROM sys.objects WHERE object_id IN (
    SELECT object_id FROM sys.columns WHERE Name = N'contract'
) AND name <> N'sysdercv'

open C
fetch next from C into @tablename

while @@fetch_status = 0
begin
    update @tablename set contract='example1' where contract='SomeCompany'
    fetch next from C into @tablename
end

close C
deallocate C
go

Однако, это дает ошибку Must declare the table variable "@tablename".

Итак, мои вопросы:

  1. Возможно ли то, что я пытаюсь сделать, или мне нужно вручную пройти и обновить все таблицы?
  2. Если это так, я на правильных линиях или я лаю совсем не на том дереве пословиц?

1 Ответ

2 голосов
/ 09 ноября 2011

В этом случае код думает, что у вас есть табличная переменная с именем @ tablename

DECLARE @tablename TABLE (SomeCol...)

Это не сработает, если вы сделаете это, потому что имена объектов почти во всех DML или DDL не могут быть параметризованы с помощью переменных.

Вы должны сделать это

SET @sql = 'update ' + @tablename + 
                ' set contract=''example1'' where contract=''SomeCompany'''
EXEC (@sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...