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