У меня есть таблицы Employees
в базе данных со столбцом EmpID
, который был изменен на ID
. Я хочу использовать один и тот же запрос как в старой, так и в новой таблице и получить одинаковый результат в зависимости от условия.
Я пробовал следующее:
IF (COL_LENGTH('Employees', 'EmpID') IS NOT NULL)
SELECT EmpID, NAME, SEX, SALARY
FROM Employees
WHERE EmpID IS NOT NULL
ELSE
SELECT ID, NAME, SEX, SALARY
FROM Employees
WHERE ID IS NOT NULL
Но когда я запускаю запрос в новой таблице, я получаю сообщение о том, что имя столбца EmpID
не существует. Любая помощь приветствуется!
У вас есть несколько баз данных на этом сервере? Если это так, просто вставьте "использовать имя базы данных" перед оператором IF.
Проблема в том, что этап компилировать отличается от этапа исполнение. Код изначально компилируется, где проверяются таблицы и столбцы.
Ваша проблема в том, что столбец не существует, поэтому вы получаете сбой компиляции.
Вы можете исправить это с помощью динамического SQL:
DECLARE @sql NVARCHAR(max);
IF (COL_LENGTH('Employees', 'EmpID') IS NOT NULL)
SET @sql = N'
Select EmpID, NAME, SEX, SALARY
From Employees
Where EmpID IS NOT NULL'
ELSE
SET @sql = N'
Select ID, NAME, SEX, SALARY
From Employees
Where ID IS NOT NULL'
EXEC sp_executesql @sql;
Вы можете сделать это без динамического SQL, используя этот подход.
SELECT ISNULL(CA.ID, CA.EmpID) AS ID,
CA.NAME,
CA.SEX,
CA.SALARY
FROM (VALUES(NULL, NULL)) V(ID, EmpID)
CROSS APPLY (SELECT ID, /*Resolved from Employees if present or "V" otherwise */
EmpID, /*Resolved from Employees if present or "V" otherwise */
NAME,
SEX,
SALARY
FROM Employees) CA
WHERE ISNULL(CA.ID, CA.EmpID) IS NOT NULL;
Спасибо, Мартин. Это отлично работающее решение, но, учитывая количество таблиц, к которым я присоединился, и сложность моего запроса, я выберу динамический SQL. Код, который я предоставил выше, - это просто образец, описывающий мою проблему, в противном случае мой код содержит более 150 строк. Еще раз спасибо.
У вас есть таблица «Сотрудники» и столбец «EmpID»?