3
IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = 'SiteInformation' 
        AND  COLUMN_NAME = 'Number_Injectors')
    BEGIN
        SELECT [Number_Injectors] as Injectors
        FROM [BLEND].[dbo].[SiteInformation]
    END

ELSE
    BEGIN
        IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE TABLE_NAME = 'SiteInformation' 
                AND  COLUMN_NAME = 'Injectors')
        BEGIN
        SELECT [Injectors] as Injectors
        FROM [BLEND].[dbo].[SiteInformation]
        END
    END

基本的な前提は、特定の機械に関する情報を収集するために、さまざまなサーバーから SiteInfomation というテーブルを参照する Visual Studio コードがあることです。問題は、これらのサーバーのいくつかが異なる列名 (Injectors と Number_Injectors) を持っていることを発見したことです。Visual Studio のデータ変数 Injectors は、情報を収集するために Injectors という名前の列を探しています。Injectors ではなく Number_Injectors という名前の列を持つ SiteInformation テーブルに関しては、返される値は NULL です。Number_Injectors と Injectors は、名前以外は同じものです。

StackOverflow を確認したところ、列が存在するかどうかを確認する方法に関するトピックが見つかり、上記のコードを作成しました。コードの if exist 部分は正常に動作しますが、2 つの列名のいずれも含まないサーバーでこのクエリを使用すると、エラーが発生します。

例: サーバー A の SiteInformation テーブルには列 Injectors があります。このコードが原因でエラーが発生します。

SELECT [Number_Injectors] as Injectors
FROM [BLEND].[dbo].[SiteInformation]

同様に、サーバー B の SiteInformation テーブルには Number_Injectors 列があります。このコードが原因でエラーが発生します。

SELECT [Number_Injectors] as Injectors
FROM [BLEND].[dbo].[SiteInformation]

私はそれを修正する方法について少し迷っています。if-exist 部分にもかかわらず、両方の Select クエリが同時に実行されているようです。どんな提案も役に立ちます。

4

1 に答える 1

3

SQL コンパイラは両方の select ステートメントを検証しようとするため、次のように EXEC に埋め込んでコンパイラから「隠す」必要があります。

EXEC ('SELECT [Number_Injectors] as Injectors
       FROM [BLEND].[dbo].[SiteInformation]')
于 2011-04-21T15:44:09.007 に答える