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

时间:2015-03-04 15:48:23

标签: sql sql-server where

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

其中一个部门的代理机构代码已经更改,现在需要在数据库中更改所有表格。

如何编写将在所有表格中查看的更改,在代理商列中将'value1'更新为'value1a',其中代理商='value1',但仅在/如果找到代理商列时运行更新部分在场?

我尝试了几种类型的脚本,其中最常见的两种是:

  • 尝试使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'
    

它给了我一个很长的脚本列表,可以针对每个表单独运行,但是在尝试运行结果集时遇到错误:

  

消息207,级别16,状态1,行1无效的列名称“Value1”。

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

3 个答案:

答案 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)

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

所以试试:

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'