使用临时表的TSQL条件

时间:2017-07-24 19:11:12

标签: sql-server tsql stored-procedures sql-server-2012

我有一个过程,该过程接受选项字段数据的XML字符串,并在用户传递任何内容时将值存储在临时表中。

例如,如果用户选择了他们想要按CountryDepartment进行搜索,那么这些临时表将包含City为空的数据。

我要做的是创建一个where clause,它将使用这些临时表中的数据作为其逻辑。

    INSERT  INTO @users(QID)
    SELECT  QID
    FROM    Employees AS e
    WHERE   e.AreaID IN ( SELECT AreaID FROM @areas )
    AND     e.SiloID IN ( SELECT SiloID FROM @silos);

但是,在这种情况下,如果@silos为空,我不希望它成为逻辑的一部分,并且应该包含e.SiloID为任何内容的数据。

示例:

@Areas

1,5,7

@Silos

NULL

查询将是:

SELECT QID 
FROM Employees 
WHERE e.AreaID IN ( SELECT AreaID FROM @areas )
AND   e.SiloID = <anything here, we ignore this logic because the temp table was empty>;

2 个答案:

答案 0 :(得分:2)

每个where条件都应该检查值是否在临时表中,临时表是否为空。这将创建一个“条件过滤器”,只有在临时表中包含记录时才会缩小结果。

INSERT  INTO @users(QID)
SELECT  QID
FROM    Employees AS e
WHERE   ( 
            -- Areas
            NOT EXISTS (SELECT AreaID FROM @areas) 
            OR e.AreaID IN ( SELECT AreaID FROM @areas )
        ) 
        AND ( 
            -- Silos
            NOT EXISTS (SELECT SiloID FROM @silos) 
            OR e.SiloID IN ( SELECT SiloID FROM @silos )
        );

继续使用此模式以保留剩余条件。

答案 1 :(得分:0)

您可以使用其他人在评论中提到的rowcount变量,或者您可以内联执行:

AND     (
  e.SiloID IN ( SELECT SiloID FROM @silos)
  OR NOT EXISTS(SELECT SiloID FROM @silos)
);