我有一个查询,可以捕获我们工厂的所有货物和成本。 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)
答案 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