使用 where 跨多个表更新列中的值
Update values in column across multiple tables using where
我有一个数据库,其中包含公司内多个部门的数据。每个部门都有一个代码,允许某些数据元素是他们独有的。此代码位于 'agency' 列中。并非所有 table 都有代理栏,但我不知道哪些有或没有此栏。
其中一个部门的机构代码已更改,现在需要在所有 table 的数据库中进行更改。
如何编写将查看所有 table 的更改脚本,将代理列中的 'value1' 更新为 'value1a',其中 agency = 'value1',但仅运行 更新部分 when/if 发现代理栏存在?
我尝试了几种类型的脚本,最流行的两种是:
- 试图使 sp_msforeachtable 工作,但似乎不适合 where 子句
尝试使用如下脚本通过轮询 information_schema 生成更新语句列表:
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'
它返回一长串脚本 运行 分别针对每个 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'
,但根据您对要求的描述,听起来应该是相反的。
value1
和 value1a
是字符串值,因此需要将它们括在引号中,否则您的脚本会将它们视为列名,如错误中所指定。
所以尝试:
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'
我有一个数据库,其中包含公司内多个部门的数据。每个部门都有一个代码,允许某些数据元素是他们独有的。此代码位于 'agency' 列中。并非所有 table 都有代理栏,但我不知道哪些有或没有此栏。
其中一个部门的机构代码已更改,现在需要在所有 table 的数据库中进行更改。
如何编写将查看所有 table 的更改脚本,将代理列中的 'value1' 更新为 'value1a',其中 agency = 'value1',但仅运行 更新部分 when/if 发现代理栏存在?
我尝试了几种类型的脚本,最流行的两种是:
- 试图使 sp_msforeachtable 工作,但似乎不适合 where 子句
尝试使用如下脚本通过轮询 information_schema 生成更新语句列表:
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'
它返回一长串脚本 运行 分别针对每个 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'
,但根据您对要求的描述,听起来应该是相反的。
value1
和 value1a
是字符串值,因此需要将它们括在引号中,否则您的脚本会将它们视为列名,如错误中所指定。
所以尝试:
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'