for all fields in database where fieldname = 'x' and field.value = y, set field.value = z
有没有办法在一个声明中不使用游标来实现这一目标?
答案 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)
不,您将需要使用表名列表并使用每个表的更新语句循环它。
非常相似良好的规范化数据库的目的是将每个独立的数据存储在一个地方。如果您在多个表中找到相同的数据,则可能需要重新考虑数据库设计。
答案 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
以跳过表而闻名。