搜索一列或另一列的存在会给我一个错误

时间:2011-04-21 15:37:53

标签: sql-server information-schema

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存在的代码部分工作正常,但如果我在不包含两个列名称之一的服务器上使用此查询,则会出错。

示例:服务器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查询同时运行。任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:3)

SQL编译器将尝试验证两个select语句,因此您需要通过将它们嵌入到这样的EXEC中来“隐藏”它们:

EXEC ('SELECT [Number_Injectors] as Injectors
       FROM [BLEND].[dbo].[SiteInformation]')