我需要编写一个查询,将在不同版本的数据库上运行。有些有一列叫做Delflag
,有些没有。如果该列存在,则应将其包含在select语句和WHERE子句中。
我用下面的代码试了试:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Bericht'
AND column_name = 'DelFlag'
)
...
ELSE
...
在IF块中,我包含了列。在ELSE块中没有提到它。但是,如果列不存在,我就会得到一个错误"Msg 207 -无效的列名"。我检查了列名只包含在IF EXISTS块中。
我试图选择和过滤列,如果它存在,如果不只是离开部分。我期望查询在不同的数据库上运行,其中列有时存在,有时不存在。如果列存在,则运行;如果列不存在,则抛出
Msg 207
无效的列名
查询在绑定阶段失败,因为您引用的列不存在。
您将使用动态sql根据您的逻辑检查构建字符串,然后使用sp_executesql
执行结果字符串这看起来像
DECLARE @sql NVARCHAR(MAX) = 'SELECT ColumnA, ColumnB';
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Bericht' AND
column_name = 'DelFlag'
)
BEGIN
SET @sql += ', DelFlag';
END
SET @sql += ' FROM Bericht;';
EXEC sp_executesql @command = @sql;