Sql server 存储过程If语句

Sql server 存储过程If语句,sql-server,tsql,stored-procedures,parameters,optional-parameters,Sql Server,Tsql,Stored Procedures,Parameters,Optional Parameters,我想让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

我想让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,并使用基于参数的查询结果


谢谢,

尝试将您的过程创建为:

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

尝试将您的过程创建为:

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

如果我正确理解您的意图,您可能想考虑一些不同的方法,例如将测试用例拆分为单独的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
...

在自然支持这些东西的语言/框架上构建测试系统可能更有用。

如果我正确理解您的意图,您可能想考虑一些不同的方法,例如将测试用例拆分为单独的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
...

在自然支持这些东西的语言/框架上构建测试系统可能更有用。

WITH是SELECT的一部分。如果不是。您的第二个版本在语法上是不正确的。对于您的问题中的第一个代码,第二个查询甚至会运行@ PARAM3=‘TEST1’或不,您应该考虑使用其他,并且对于第二个代码,它是不同步的。您可以使用显式IF。开始结束,否则就开始。。结束块,并可能使用复制或使用。。。选择其中@param3='test1'联合所有选择项。。。其中@param3为NULL或@param3“test1”。这两种方法都不是很优雅,但这是适合您的T-SQL。考虑表变量、临时表或表值参数,如果你感觉分裂,逻辑是非常有价值的。戈登,我很害怕,谢谢。Jeroen,我的问题的简单性是显而易见的。我试图避免重复内部查询。我会看看你的选择。ThanksWITH是SELECT的一部分。如果不是。您的第二个版本在语法上是不正确的。对于您的问题中的第一个代码,第二个查询甚至会运行@ PARAM3=‘TEST1’或不,您应该考虑使用其他,并且对于第二个代码,它是不同步的。您可以使用显式IF。开始结束,否则就开始。。结束块,并可能使用复制或使用。。。选择其中@param3='test1'联合所有选择项。。。其中@param3为NULL或@param3“test1”。这两种方法都不是很优雅,但这是适合您的T-SQL。考虑表变量、临时表或表值参数,如果你感觉分裂,逻辑是非常有价值的。戈登,我很害怕,谢谢。Jeroen,我的问题的简单性是显而易见的。我试图避免重复内部查询。我会看看你的选择。谢谢,谢谢。通过我的简单示例,我可以看到您的代码在哪里处理它。我的问题是我有4个嵌套查询,希望有条件使用中间结果。另外@param3将有多个选项,这不是简单的IF ELSESami,谢谢。通过我的简单示例,我可以看到您的代码在哪里处理它。我的问题是我有4个嵌套查询,希望有条件使用中间结果。另外@param3将有多个选项,而不是简单的IF-ELSE