Sql server 存储过程If语句
我想让sp使用条件参数,例如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
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