У меня есть база данных, содержащая множество таблиц, большинство из которых имеет столбец с именем 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".
Итак, мои вопросы:
- Возможно ли то, что я пытаюсь сделать, или мне нужно вручную пройти и обновить все таблицы?
- Если это так, я на правильных линиях или я лаю совсем не на том дереве пословиц?