#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. Опередите меня в этом. Хороший ответ. =]