跨db更新所有表

时间:2013-12-12 20:23:58

标签: sql sql-server sql-server-2008

for all fields in database where fieldname = 'x' and field.value = y, set field.value = z

有没有办法在一个声明中不使用游标来实现这一目标?

4 个答案:

答案 0 :(得分:1)

这非常危险,但您可以使用动态sql完成它。首先,在数据库中查询模式,表和列,为您生成sql,然后运行它。类似下面的内容(可能需要一些调整),假设您想要匹配和设置的所有值都是静态的,您可能还想将它包装在一个事务中,这样如果它不能按预期工作就可以退出(应该是很容易做到)

DECLARE @statement  VarChar(Max)

SELECT @statement = COALESCE(@statement + ' ', '') +
                    'UPDATE ' + s.name + '.' + t.name +
                    ' SET ' + c.name + ' = ''some value''' +
                    ' WHERE ' + c.name + ' = ''match this'''
FROM sys.schemas s
INNER JOIN sys.tables t
    ON s.schema_id = t.schema_id
    INNER JOIN sys.columns c
        ON t.object_id = c.object_id
WHERE c.name = 'MyColumnName'

-- run our generated statement
EXEC (@statement)

如果您执行 EXEC SELECT @statement安装程序,您应该能够看到生成的更新语句以确保其正常工作,并且应该看起来像这样(在一行中)当然)

UPDATE someSchema.SomeTable1 SET MyColumnName = 'some value' WHERE MyColumnName = 'match this'
UPDATE someSchema2.SomeTable2 SET MyColumnName = 'some value' WHERE MyColumnName = 'match this'

答案 1 :(得分:0)

不,您将需要使用表名列表并使用每个表的更新语句循环它。

此问题与this one about mysql.

非常相似

良好的规范化数据库的目的是将每个独立的数据存储在一个地方。如果您在多个表中找到相同的数据,则可能需要重新考虑数据库设计。

答案 2 :(得分:0)

sp_msforeachtable
"update ? set x=z where x=y"

答案 3 :(得分:0)

EXECUTE sp_MSforeachtable 
@command1='UPDATE ? SET field.value = ''z''',
@whereand = 'AND fieldname = ''x'' and field.value = ''y'''

警告

sp_MSforeachtable以跳过表而闻名。