当变量为Null时,T-SQL跳过cte表和Union

当变量为Null时,T-SQL跳过cte表和Union,sql,sql-server,tsql,variables,common-table-expression,Sql,Sql Server,Tsql,Variables,Common Table Expression,我有一个查询,它捕获了我们工厂的所有发货和成本。Google Drive上的示例数据和所需输出如下: 问题是我们有两种不同的销售方式。一个是我们制作的“Regluar”,另一个是我们买卖的“buy/sell” 为了捕获成本,我不得不编写两个查询,每个场景一个查询。这个查询的最终用户可以输入一个日期范围,然后查询工作正常,但是当涉及到变量@Job\u No时,我就卡住了 通过我们工厂(cteRegularJobs)进行的所有工作都有一个与之关联的作业编号,我已经声明了一个变量,以便用户可以使用它

我有一个查询,它捕获了我们工厂的所有发货和成本。Google Drive上的示例数据和所需输出如下:

问题是我们有两种不同的销售方式。一个是我们制作的“Regluar”,另一个是我们买卖的“buy/sell”

为了捕获成本,我不得不编写两个查询,每个场景一个查询。这个查询的最终用户可以输入一个日期范围,然后查询工作正常,但是当涉及到变量@Job\u No时,我就卡住了

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

最初@Job_No声明为“”,当它保留为“”时,我希望返回两个cte表的结果。如果用户有一个条目,即“001”,则我希望得到cteRegularJobs的结果

如果这样做更容易,我愿意声明cteBuyandSell.Job\u除了空以外没有其他东西,比如“买卖”

真正的查询很复杂,下面是一个简化的结构示例:

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)

您可以使用IF语句从逻辑上对此进行分解,以检查变量的值。不过我建议在空白处使用空值。下面是一个示例过程。。。使用您提供的有限代码

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

我认为样本数据和期望的结果将真正有助于解释您正在做什么。根据您的描述,CTE不应返回任何行,因为
tblJobs.Job_No
在该表中为NULL——如果一个操作数
NULL
@GordonLinoff,则
LIKE
不会返回true,谢谢您的建议。更新了问题,并链接到样本数据。