我有一个包含很多表的数据库,其中大多数都有一个名为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".
所以我的问题是:
答案 0 :(得分:2)
在这种情况下,代码认为您有一个名为@tablename
的表变量DECLARE @tablename TABLE (SomeCol...)
如果这样做,这将不起作用,因为几乎所有DML或DDL中的对象名称都不能用变量进行参数化。
你必须这样做
SET @sql = 'update ' + @tablename +
' set contract=''example1'' where contract=''SomeCompany'''
EXEC (@sql)