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 に答える