首页 > 解决方案 > 存储过程 If 语句

问题描述

我想让 sp 使用条件参数,例如

CREATE PROCEDURE spTest
(
    @param1 DATE,
    @param2 DATE,
    @param3 NVARCHAR(8) = null
)

AS

IF (@param3 = 'test1')
BEGIN
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM db1 GROUP BY a
END

WITH innerQuery1 AS
(
    SELECT a, b, c FROM db2 WHERE a >=@param1 AND a <= @param2
)
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM innerQuery1 GROUP BY a

我知道这是非常通用的,但这个过程有效。我正在尝试做的是将条件“放在中间”,例如。

CREATE PROCEDURE spTest
(
    @param1 DATE,
    @param2 DATE,
    @param3 NVARCHAR(8) = null
)

AS

WITH innerQuery1 AS
(
    SELECT a, b, c FROM db2 WHERE a >=@param1 AND a <= @param2
)

IF (@param3 = 'test1')
BEGIN
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM db1 GROUP BY a
END

    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM innerQuery1 GROUP BY a

现在发生的事情是它再也看不到 innerQuery1 了。在 WITH 中不能有条件吗?

关于为什么它不起作用的任何想法?我的实际查询更长,嵌套更多。基本上尝试在这种情况下只拥有一个 sp 并使用基于参数的查询结果。

谢谢,

标签: sql-servertsqlstored-proceduresparametersoptional-parameters

解决方案


如果我正确理解您的意图,您可能想考虑一些不同的方法,例如将测试用例拆分为单独的 SP 并与它们组成测试套件:

CREATE PROC TestSuite_CheckAggregations
    @arg,
    @param1, @param2
as
  ...
  SET @testCase = CASE @arg 
     WHEN '1' THEN 'TestCase_1_innerQuery'
     WHEN '2' THEN `TestCase_2_DirectQuery`
  END
  ...
  EXEC @testCase
    @param1, @param2
  ...
END



CREATE PROC TestCase_1_innerQuery
...

CREATE PROC TestCase_2_DirectQuery
...

在自然支持此类事物的语言/框架上构建测试系统可能更有用。


推荐阅读