SQL Server: выполнение запроса условно - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть 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 ошибка не существует. Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вы можете сделать это без динамического 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; 

Демо

0 голосов
/ 08 сентября 2018

Проблема заключается в этапе компиляции против этапа исполнения . Код изначально компилируется, где проверяются таблицы и столбцы.

Ваша проблема в том, что столбец не существует, поэтому вы получаете ошибку компиляции.

Это можно исправить с помощью динамического 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...