0

ストアド プロシージャの 1 つに典型的な「無効な列名」がありますが、一般的な回避策で問題を解決する方法を理解するのに苦労しています :(

私のストアドプロシージャは次のようなことをします:

IF EXISTS (SELECT * FROM sysobjects o 
           JOIN syscolumns c 
           ON o.id = c.id
           WHERE o.Name = 'Table_A'
           AND c.Name = 'Column_A')

    BEGIN
       SELECT * FROM Table_B
       JOIN Table_A
       ON Table_B.Column_B = Table_A.Column_B
       WHERE Table_A.Column_A = 1
       FOR XML AUTO
   END

ELSE
    --Do something completely different

だから... Table_A.Column_A が無効であるというエラーが表示されますが、クエリでそれを参照するにはどうすればよいですか? 「FOR XML AUTO」部分までの文字列を作成する動的SQLを使用し、ストアドプロシージャを使用して「FOR XML AUTO」部分にタグを付けようとしましたが、それが問題かもしれませんが、同じエラーが発生します.

一部の人々が尋ねると確信している質問に答えるために、クエリ:

SELECT * FROM sysobjects o 
           JOIN syscolumns c 
           ON o.id = c.id
           WHERE o.Name = 'Table_A'
           AND c.Name = 'Column_A'

Column_A が Table_A にない場合に予想されるように、結果は得られません。

そして...いいえ、代わりにデータベース構造を変更することはできません。データベースインスタンスに応じて、テーブルにこの列が含まれる場合と含まれない場合があるため、この回避策が必要であり、「キャッチオール」が必要です.. .

明るいアイデアはありますか?

4

1 に答える 1

1

問題は、サブクエリでの参照のために、データに列が存在しない限り、コードが解析されないことです。はif実行時に評価されます。すべてのクエリは、コンパイル時に解析する必要があります。

これを回避する唯一の方法 (私が知っている) は、動的 SQL です。

動作するコードのサンプルを次に示します。

   declare @x xml;
   declare @sql nvarchar(max) = '
   select @x = (SELECT *
             FROM INFORMATION_SCHEMA.tables t JOIN
                  INFORMATION_SCHEMA.COLUMNS c
                  ON t.TABLE_NAME = c.TABLE_NAME
             WHERE t.TABLE_SCHEMA = ''dbo''
             FOR XML AUTO
            )';

   exec sp_executesql @sql, N'@x xml output', @x = @x output;

   select @x;

次に、そのif上に条件を配置して、実際のクエリ用に変更できます。

于 2013-05-30T14:13:51.030 に答える