存储过程If语句

时间:2018-09-23 19:02:51

标签: sql-server tsql stored-procedures parameters optional-parameters

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

var bmp = BitmapSource.Create(img.PixelWidth, img.PixelHeight, DPI, DPI, PixelFormats.Rgb24, img.Palette, destPixelData, img.PixelWidth/24);

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

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

现在发生的事情是它不再可以看到innerQuery1。您可以在WITH中没有条件吗?

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

谢谢

2 个答案:

答案 0 :(得分:1)

尝试将您的过程创建为:

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
    ELSE
        BEGIN
            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;
        END
GO

答案 1 :(得分:1)

如果我理解您的意图,那么您可能需要考虑一些其他方法,例如将测试用例拆分为单独的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
...

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