我有一个数据库,其中包含公司内多个部门的数据。每个部门都有一个代码,允许某些数据元素对它们是独占的。此代码位于“代理”列中。并非所有表都有代理列,但我不知道哪些表有或没有此列。
其中一个部门的代理机构代码已经更改,现在需要在数据库中更改所有表格。
如何编写将在所有表格中查看的更改,在代理商列中将'value1'更新为'value1a',其中代理商='value1',但仅在/如果找到代理商列时运行更新部分在场?
我尝试了几种类型的脚本,其中最常见的两种是:
尝试通过使用如下脚本轮询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'
它给了我一个很长的脚本列表,可以针对每个表单独运行,但是在尝试运行结果集时遇到错误:
消息207,级别16,状态1,行1无效的列名称“Value1”。
如果您需要我澄清,请告诉我。
答案 0 :(得分:0)
您的第二个选项(生成脚本)似乎是最好的选择。
现在,至于你的错误。您的代理商代码是字符串吗?那可能是问题所在:你需要将它括在引号中。由于您正在构建字符串,因此需要加倍:
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'
,但是根据您对要求的描述,它听起来应该是相反的。
答案 1 :(得分:0)
value1
和value1a
是字符串值,因此需要将它们括在引号中,否则您的脚本会将它们视为列名,如错误中所指定。
所以试试:
select 'update dbo.' + t.TABLE_NAME +
' set agency = ''value1'' where agency = ''value1a'''
答案 2 :(得分:0)
您必须更改使用双引号转义值的脚本:
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'