sql-server - 存储过程 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 并使用基于参数的查询结果。
谢谢,
解决方案
如果我正确理解您的意图,您可能想考虑一些不同的方法,例如将测试用例拆分为单独的 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
...
在自然支持此类事物的语言/框架上构建测试系统可能更有用。
推荐阅读
- python - Tensorflow DecodeJPEG:预期的图像(JPEG、PNG 或 GIF),格式未知,以 '\000\000\000\000\000\000\000\00' 开头
- html - 我希望创建一个具有图表或某种类型的视觉辅助工具的论坛,以显示该论坛有多少成员?
- docker - 意外耗尽了 Kubernetes 中的所有节点(甚至是主节点)。我怎样才能把我的 Kubernetes 带回来?
- azure - Set-AzWebAppSlot 能否仅覆盖 1 个应用程序设置?
- reactjs - 导出 + 导入对象与上下文
- css - 如何计算一个 div 的宽度并使其所有兄弟姐妹采用最大尺寸,以便使用 CSS 看起来一致?
- sql - TSQL多列上的多个搜索条件
- node.js - 亚马逊 lex 问题分岔
- react-native - 在反应原生的屏幕之间移动
- python - 如何为我的 python 项目添加背景?