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查询同时运行。任何建议都会有所帮助。
答案 0 :(得分:3)
SQL编译器将尝试验证两个select语句,因此您需要通过将它们嵌入到这样的EXEC中来“隐藏”它们:
EXEC ('SELECT [Number_Injectors] as Injectors
FROM [BLEND].[dbo].[SiteInformation]')