SQL TRY-CATCH和缺少的列

ser*_*hio 3 sql sql-server sql-server-2005 try-catch

我有以下(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
Run Code Online (Sandbox Code Playgroud)

在BAR表中我可以(在旧数据库上)或不在(在一些更新的数据库中)IDFOO列.因此,对于缺少的IDFOO列,我想留下@L_ID_FOO_BAR = NULL,以防该列存在时选择相应的IDFOO.

但是,当在没有该列的基础上执行脚本时,我获得:

列名无效:'IDFOO'

我已经用脚本包围了脚本

IF EXISTS(SELECT 1 FROM SYSCOLUMNS 
WHERE ID = OBJECT_ID('BAR') AND NAME = 'IDFOO') 
Run Code Online (Sandbox Code Playgroud)

但这没有帮助,它抱怨无效的栏目......

问题
a)如果要在两个数据库上使用此脚本,无论是否有该列,该怎么办?
b)为什么 try-catch不能隐藏无效的列错误?

Ric*_*iwi 8

问题(b)更容易回答 - 你所面临的是编译时检查,它胜过在运行时工作的TRY-CATCH.

为一个)

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
Run Code Online (Sandbox Code Playgroud)