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

基本前提是我有 Visual Studio 代码,它引用来自不同服务器的名为 SiteInfomation 的表来收集有关某台机器的信息。事情是我发现其中一些服务器具有不同的列名(Injectors 和 Number_Injectors)。Visual Studio 中的数据变量 Injectors 正在寻找名为 Injectors 的列来收集信息。对于具有名为 Number_Injectors 而不是 Injectors 的列的 SiteInformation 表,返回的值为 NULL。Number_Injectors 和 Injectors 都是一个,除了名称之外是相同的。

我检查了 StackOverflow 并找到了一个关于如何检查列是否存在并创建上述代码的主题。代码的 if exist 部分工作正常,但如果我在不包含两个列名之一的服务器上使用此查询,则会收到错误消息。

示例:来自服务器 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 回答