SQL使用IF / ELSE更新不同的列名

时间:2018-02-13 16:36:15

标签: sql sql-update

我想创建一个语句,它将以两种不同的方式更新表,因为有两个不同版本的数据库表。我写了以下内容:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Processes' AND COLUMN_NAME = 'Critical')
BEGIN
    UPDATE Processes SET Critical = 1 WHERE SystemProcessName = 'Test'
END
ELSE
BEGIN
    UPDATE Processes SET ServiceStartEnabled = 1, Visible = 1 WHERE SystemProcessName = 'Test'
END

如果存在“Critical”列,则更新表“Critical”列。否则,请更新“ServiceStartEnabled”& “可见”栏目。

当我运行上述操作时,SQL会显示以下错误:

Msg 207,Level 16,State 1,Line 7 列名称“ServiceStartEnabled”无效。 Msg 207,Level 16,State 1,Line 7 列名称“可见”无效。

我无法弄清楚当我运行的数据库在“进程”表中包含“关键”列时,SQL运行在ELSE条件中包含的UPDATE语句的原因(当我只运行SELECT时声明在IF EXISTS中返回一条记录)。

如果有人想知道我的修复是使用Gareth提到的动态SQL,那么我最终得到了这个:

    DECLARE @UpdateStatement NVARCHAR(MAX)

    IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 
'Processes' AND COLUMN_NAME = 'Critical')
BEGIN
SET @UpdateStatement = 'UPDATE Processes SET Critical = 1 WHERE SystemProcessName = ''Test''' COLLATE SQL_Latin1_General_CP1_CS_AS
    EXEC sp_executesql @UpdateStatement
END
ELSE
BEGIN
    SET @UpdateStatement = 'UPDATE Processes SET ServiceStartEnabled = 1, Visible = 1 
WHERE SystemProcessName = ''Test''' COLLATE SQL_Latin1_General_CP1_CS_AS
    EXEC sp_executesql @UpdateStatement
END

0 个答案:

没有答案