SQL Server:有条件地执行查询

时间:2018-09-08 04:30:15

标签: sql-server tsql

我在数据库中有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 :(得分:1)

问题在于 compile 阶段而不是 execution 阶段。最初会编译代码,并在其中验证表和列。

您的问题是该列不存在,因此您遇到了编译失败。

您可以使用动态SQL来解决此问题:

XmlWriter

答案 1 :(得分:1)

您可以使用this approach,而无需动态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; 

Demo