MS SQL使用游标更新多个表中的相同列

时间:2011-11-09 10:52:23

标签: sql-server sql-update database-cursor

我有一个包含很多表的数据库,其中大多数都有一个名为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 个答案:

答案 0 :(得分:2)

在这种情况下,代码认为您有一个名为@tablename

的表变量
DECLARE @tablename TABLE (SomeCol...)

如果这样做,这将不起作用,因为几乎所有DML或DDL中的对象名称都不能用变量进行参数化。

你必须这样做

SET @sql = 'update ' + @tablename + 
                ' set contract=''example1'' where contract=''SomeCompany'''
EXEC (@sql)