我有以下内容(SQL Server 2005)
DECLARE @L_ID_FOO_BAR INT
BEGIN TRY
SELECT @L_ID_FOO_BAR = IDFOO
FROM BAR
WHERE IDFOO = 5
END TRY
BEGIN CATCH
SELECT @L_ID_FOO_BAR = NULL
END CATCH
在 BAR 表中,我可以(在旧数据库上)或不(在一些较新的数据库中)使用 IDFOO 列。因此,对于缺少的 IDFOO 列,我想保留 @L_ID_FOO_BAR = NULL,以防该列存在,请选择相应的 IDFOO。
但是,在没有该列的基础上执行脚本时,我得到:
无效的列名称:"IDFOO"
我已经包围了脚本
IF EXISTS(SELECT 1 FROM SYSCOLUMNS
WHERE ID = OBJECT_ID('BAR') AND NAME = 'IDFOO')
但这没有帮助,它抱怨无效的列...
问题
a) 如何使此脚本在两个数据库上工作,无论是否使用该列?
b) 为什么 try-catch 不隐藏无效列错误?
问题(b)更容易回答 - 你面临的是一个编译时检查,它胜过在运行时工作的TRY-CATCH。
对于(a)
DECLARE @L_ID_FOO_BAR INT;
DECLARE @SQL NVARCHAR(MAX) = '
SELECT @L_ID_FOO_BAR = IDFOO
FROM BAR
WHERE IDFOO = 5';
BEGIN TRY
EXEC sp_executesql @SQL, N'@L_ID_FOO_BAR INT output', @L_ID_FOO_BAR output;
END TRY
BEGIN CATCH
SELECT @L_ID_FOO_BAR = NULL -- redundant? it starts with NULL
END CATCH
检查syscolumns
或information_schema
列是否存在,然后构建一个动态 sql 查询,然后使用sp_executesql
执行该查询,无论是否缺少缺少列。