首页 > 解决方案 > 更新 SQL Server 中具有列名的所有表中的值

问题描述

我正在编写一个存储过程,它需要在数据库中搜索具有特定列名的所有表。获得包含该列的表列表后,我需要更新该列中的值。所以首先我得到一个具有特定列的表列表。

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE 'company' 
ORDER BY    TableName

现在我有了需要更新的表的列表,我需要运行类似于以下内容的查询来更新每个表中的数据。

update table1 set company = @newValue where company = @oldvalue

我不知道如何去写这部分。我的第一个想法是在游标内编写一个动态更新语句,例如:

Declare @newValue
Declare @oldValue
SET @companyCursor = CURSOR FOR
SELECT      t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE 'company' 

OPEN @companyCursor;

FETCH NEXT FROM @companyCursor INTO @tableName;

WHILE @@FETCH_STATUS = 0
BEGIN
 update @tableName set company = @newValue where company = @oldValue
 FETCH NEXT FROM @companyCursor INTO INTO @tableName;
END

这是一个好策略吗?

标签: sql-servertsql

解决方案


不,最后的更新将不起作用。您需要像这样使用 exec (@sql):

declare @sql varchar(4000)
begin
    set @sql = 'update ' +  @tableName  + 'set company = ' +          @newValue +  'where company = ' +   @oldValue 
    exec (@sql)
   fetch next ...
end

这假设 @newvalue 和 @oldvalue 在某处被赋值。


推荐阅读