3

我有以下(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 不隐藏无效列错误?

4

2 回答 2

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
于 2012-10-10T10:00:42.577 回答
2

我会检查列syscolumns是否information_schema存在,然后构建一个动态 sql 查询,然后在sp_executesql有或没有缺失列的情况下执行该查询。

于 2012-10-10T09:57:31.443 回答