更新表集(子查询)=' 0'

时间:2016-01-24 19:24:26

标签: sql sql-server sql-server-2012

Microsoft SQL Server 2012,Management Studio

我需要偶尔更新一个值为零的表中的单行。问题是有250列,所以我不想对列进行硬编码,列数没有修复,下次运行代码时可能会改变。

我有这个SQL代码,它返回我正在寻找的列名。

SELECT
    COLUMN_NAME
FROM
    information_schema.columns
WHERE 
    TABLE_NAME = 'TABLE_NAME' 
    AND COLUMN_NAME <> 'Id'
    AND COLUMN_NAME <> 'FkId'
    AND COLUMN_Name <> 'Business'

我想要做的是将该查询作为子查询封装到UPDATE中。

SET (subquery) = '0' WHERE [Id] = someid.

但是我在尝试这个时遇到错误。好像我应该能做到这一点,但我仍然得到错误:

  

Msg 102,Level 15,State 1,Line 8
  &#39;(&#39;。

附近的语法不正确      

Msg 102,Level 15,State 1,Line 17
  &#39; =&#39;附近的语法不正确。

尝试后:

UPDATE TABLE_NAME
SET (SELECT
         COLUMN_NAME
     FROM
        information_schema.columns
     WHERE TABLE_NAME = 'TABLE_NAME' 
       AND COLUMN_NAME <> 'Id'
       AND COLUMN_NAME <> 'FkId'
       AND COLUMN_Name <> 'Business') = '0'
WHERE 
    Id = '26524'

我环顾四周,似乎没有SET(子查询)= 0的方法。

难住了。

1 个答案:

答案 0 :(得分:3)

试试这样:

DECLARE @SqlCmd VARCHAR(MAX) = 'UPDATE TABLE_NAME SET ' +  
STUFF(
(
    SELECT
        ',' + COLUMN_NAME + '=0' 
    FROM
        information_schema.columns
    WHERE 
        TABLE_NAME = 'TABLE_NAME' 
        AND COLUMN_NAME <> 'Id'
        AND COLUMN_NAME <> 'FkId'
        AND COLUMN_Name <> 'Business'
    FOR XML PATH('')
),1,1,'') + ' WHERE SomeWhereCrit=123;'

SELECT @SqlCmd;

--If the select shows the correct command, remove the double minus before EXEC
--EXEC(@SqlCmd);