变量为空时,T-SQL跳过cte表和联合

时间:2017-01-30 15:31:58

标签: sql sql-server tsql variables common-table-expression

我有一个查询,可以捕获我们工厂的所有货物和成本。 Google云端硬盘上的示例数据和所需输出:

https://drive.google.com/open?id=0B4xdnV0LFZI1VndEaGgxNDVpU2M

问题是我们有两种不同的销售方式。一个是'Regluar',我们制作它,另一个是'买/卖',我们在那里买卖。

为了捕获我必须编写两个查询的成本,每个方案一个。此查询的最终用户可以输入日期范围,然后查询效果很好,但是当涉及变量@Job_No时,我会陷入困境。

通过我们工厂的所有工作(cteRegularJobs)都有一个与之关联的工作号,我已经声明了一个变量,因此用户可以使用它进行搜索。对于在SELECT语句中声明的Job_No,cteBuyandSell的值为'NULL',因此我可以在最后执行这两个表的UNION。但是,没有买/卖工作分配了工作号,它们总是为空。

最初@Job_No被声明为'',当它离开时''我希望返回两个cte表的结果。如果用户有一个条目,即'001',那么我想要cteRegularJobs的结果。

如果它变得更容易,我会公开声明cteBuyandSell.Job_No除了NULL以外的其他东西,比如“买卖”。

真正的查询很复杂,所以这里是结构的简化示例:

DELCARE @Job_No AS varchar(10) = '';
SET @Job_No = {User Input or leave as ''};

WITH
    cteBuyandSell AS ( NULL AS 'Job_No',
      ...),
    cteRegularJobs AS (tblJobs.Job_No AS 'Job_No',
      ...
        WHERE tblJobs.Job_No LIKE @Job_No)

SELECT *
FROM
(cteBuyandSell
 UNION
 cteRegularJobs)

1 个答案:

答案 0 :(得分:1)

您可以使用IF语句在逻辑上将其分解,以检查变量的值。我建议在空白区域使用NULL。这是一个示例程序...使用您提供的有限代码。

CREATE PROCEDURE getData(@Job_No varchar(10) = NULL)
AS

IF @Job_No IS NULL
    BEGIN

        WITH
            cteBuyandSell AS ( NULL AS 'Job_No',
              ...),
            cteRegularJobs AS (tblJobs.Job_No AS 'Job_No',
              ...
                WHERE tblJobs.Job_No LIKE @Job_No)

        SELECT *
        FROM
        (cteBuyandSell
         UNION
         cteRegularJobs)
    END

ELSE
    BEGIN
        WITH
            cteRegularJobs AS (tblJobs.Job_No AS 'Job_No',
              ...
                WHERE tblJobs.Job_No LIKE @Job_No)

        SELECT * FROM cteRetularJobs

    END