使用循环值作为变量名称的一部分

时间:2015-10-30 11:30:36

标签: sql-server tsql loops variables

有没有办法缩短这部分代码来替换嵌套循环中驱动程序[n]声明[n]日期的数字部分?我进入SQL编程已经8天了,但是从35年前的编程日看起来非常笨拙:)任何帮助都很乐意接受。

Start of loop
 nested loop

CASE WHEN Driver1Claim1Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver1Claim1Date IS NULL THEN 0
                  WHEN Driver1Claim1Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver1Claim2Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver1Claim2Date IS NULL THEN 0
                  WHEN Driver1Claim2Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver1Claim3Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver1Claim3Date IS NULL THEN 0
                  WHEN Driver1Claim3Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver1Claim4Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver1Claim4Date IS NULL THEN 0
                  WHEN Driver1Claim4Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver1Claim5Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver1Claim5Date IS NULL THEN 0
                  WHEN Driver1Claim5Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver1Claim6Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver1Claim6Date IS NULL THEN 0
                  WHEN Driver1Claim6Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver2Claim1Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver2Claim1Date IS NULL THEN 0
                  WHEN Driver2Claim1Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver2Claim2Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver2Claim2Date IS NULL THEN 0
                  WHEN Driver2Claim2Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver2Claim3Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver2Claim3Date IS NULL THEN 0
                  WHEN Driver2Claim3Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver2Claim4Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver2Claim4Date IS NULL THEN 0
                  WHEN Driver2Claim4Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver2Claim5Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver2Claim5Date IS NULL THEN 0
                  WHEN Driver2Claim5Type = 'At fault' THEN 1 ELSE 0 END
+CASE WHEN Driver2Claim6Date BETWEEN t.PolicyStarted AND t.PolicyEnd THEN 0
                  WHEN Driver2Claim6Date IS NULL THEN 0
                  WHEN Driver2Claim6Type = 'At fault' THEN 1 ELSE 0 END
 end of nested loop
End of outer loop

1 个答案:

答案 0 :(得分:1)

我完全赞同这些意见,表明正确的规范化是解决这个问题的最佳方法。话虽如此,有些解决方案可以使用,不涉及架构修改......

  1. 如前所述,您可以使用临时表,本地表变量或CTE来unpivot您的数据,从而使其在存储过程的生命周期中更准确地规范化。这样可以更容易使用,但会给存储过程增加额外的开销。

  2. 您可以使用动态SQL来构建查询。这将允许您将循环迭代计数器“插入”到列名称中。动态SQL有一些缺点。但我在很多情况下使用它。如果使用得当,它可以成为您工具箱中的好工具。这是an article about Dynamic SQL应该有用。