使用 where 跨多个表更新列中的值

Update values in column across multiple tables using where

我有一个数据库,其中包含公司内多个部门的数据。每个部门都有一个代码,允许某些数据元素是他们独有的。此代码位于 'agency' 列中。并非所有 table 都有代理栏,但我不知道哪些有或没有此栏。

其中一个部门的机构代码已更改,现在需要在所有 table 的数据库中进行更改。

如何编写将查看所有 table 的更改脚本,将代理列中的 'value1' 更新为 'value1a',其中 agency = 'value1',但仅运行 更新部分 when/if 发现代理栏存在?

我尝试了几种类型的脚本,最流行的两种是:

它返回一长串脚本 运行 分别针对每个 table,但随后我在尝试 运行 结果集时遇到错误:

Msg 207, Level 16, State 1, Line 1 Invalid column name 'Value1'.

如果您需要我澄清,请告诉我。

你的第二个选项(生成脚本)似乎是最好的。

现在,关于你的错误。您的机构代码是字符串吗?那么这可能就是问题所在:您需要将其括在引号中。由于您正在构建字符串,因此需要将它们加倍:

 select 'update dbo.' + t.TABLE_NAME + 
        ' set agency = ''value1a'' where agency = ''value1'''
 from INFORMATION_SCHEMA.TABLES t
  join INFORMATION_SCHEMA.COLUMNS c1
    on T.TABLE_NAME = C1.TABLE_NAME
  join INFORMATION_SCHEMA.COLUMNS c2
    on t.TABLE_NAME = c2.TABLE_NAME
  where t.TABLE_TYPE = 'BASE TABLE'
    and c1.COLUMN_NAME = 'agency'
    and c2.COLUMN_NAME = 'agency'

您的示例将机构设置为 'value1',而之前是 'value1a',但根据您对要求的描述,听起来应该是相反的。

value1value1a 是字符串值,因此需要将它们括在引号中,否则您的脚本会将它们视为列名,如错误中所指定。

所以尝试:

select 'update dbo.' + t.TABLE_NAME + 
       ' set agency = ''value1'' where agency = ''value1a'''

您必须更改脚本以使用双引号转义值:

    select 'update dbo.' + t.TABLE_NAME + ' set agency = ''value1'' where agency = ''value1a'' '
from INFORMATION_SCHEMA.TABLES t
join INFORMATION_SCHEMA.COLUMNS c1
on T.TABLE_NAME = C1.TABLE_NAME
join INFORMATION_SCHEMA.COLUMNS c2
on t.TABLE_NAME = c2.TABLE_NAME
where t.TABLE_TYPE = 'BASE TABLE'
and c1.COLUMN_NAME = 'agency'
and c2.COLUMN_NAME = 'agency'