Поиск в существовании того или иного столбца выдает ошибку

#sql-server #information-schema

#sql-server #информация-схема

Вопрос:

 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 с разных серверов для сбора информации, касающейся определенного оборудования. Дело в том, что я обнаружил, что у пары этих серверов разные имена столбцов (инжекторы и Number_Injectors). Инжекторы переменных данных из Visual Studio ищут столбцы с именами инжекторы для сбора информации. Когда дело доходит до таблицы SiteInformation, в которой столбец с именем Number_Injectors вместо Injectors, возвращаемое значение равно NULL. Number_Injectors и инжекторы — это одно и то же, за исключением имени.

Я проверил StackOverflow и нашел раздел о том, как проверить, существует ли столбец, и создал код, упомянутый выше. Часть кода if exist работает нормально, но я получаю сообщение об ошибке, если я использую этот запрос на сервере, который не содержит ни одного из двух имен столбцов.

Пример: Таблица SiteInformation с сервера A содержит инжекторы столбцов. Это выдало бы мне ошибку из-за этого кода:

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

Аналогично, таблица SiteInformation с сервера B содержит столбец Number_Injectors. Это выдало бы мне ошибку из-за этого кода:

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

Я немного запутался в том, как это исправить. Похоже, что оба запроса Select выполняются одновременно, несмотря на часть if-exist. Любые предложения будут полезны.

Ответ №1:

Компилятор SQL попытается проверить оба оператора select, поэтому вам нужно будет «скрыть» их от компилятора, внедрив их в EXEC, подобный этому:

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

Комментарии:

1. Это сделало это. Большое вам спасибо. Использование EXEC никогда не приходило мне в голову.

2. Опередите меня в этом. Хороший ответ. =]