2017-09-19 55 views
-1

我们有一个面额表,它存储每个唯一标识符关键字和每个面额的记录,因此任何给定的唯一标识符关键字最多可以有13行,用于指示面额达到该行内有7种不同的交易类型。我可以轻松地复制和粘贴下面的查询(这很好用)7次,每次都使用不同的SET和WHERE子句组合,但这看起来很乱,很长。使用IF语句更新字段的T-SQL动态更改字段

查询:

UPDATE #RecycleCashDenomsClone 
    SET startBal = 
     CASE 
      WHEN B.DenomType = '1.00' THEN A.d_01 
      WHEN B.DenomType = '2.00' THEN A.d_02 
      WHEN B.DenomType = '5.00' THEN A.d_05 
      WHEN B.DenomType = '10.00' THEN A.d_10 
      WHEN B.DenomType = '20.00' THEN A.d_20 
      WHEN B.DenomType = '50.00' THEN A.d_50 
      WHEN B.DenomType = '100.00' THEN A.d_100 
      WHEN B.DenomType = 'C0.01' THEN A.c_01 
      WHEN B.DenomType = 'C0.05' THEN A.c_05 
      WHEN B.DenomType = 'C0.10' THEN A.c_10 
      WHEN B.DenomType = 'C0.25' THEN A.c_25 
      WHEN B.DenomType = 'C0.50' THEN A.c_50 
      WHEN B.DenomType = 'C1.00' THEN A.c_100 
     END 
    FROM #VaultTotals A INNER JOIN #RecycleCashDenomsClone B ON A.importKey = B.importKey 
    WHERE A.identifier = 'D0510' 

我会喜欢做...设置if语句改变@updatedField和@whereField(VARCHAR处理),以7点不同的组合,并将其传递到查询,如下所示:

UPDATE #RecycleCashDenomsClone 
    SET @updatedField = 
     CASE 
      WHEN B.DenomType = '1.00' THEN A.d_01 
      WHEN B.DenomType = '2.00' THEN A.d_02 
      WHEN B.DenomType = '5.00' THEN A.d_05 
      WHEN B.DenomType = '10.00' THEN A.d_10 
      WHEN B.DenomType = '20.00' THEN A.d_20 
      WHEN B.DenomType = '50.00' THEN A.d_50 
      WHEN B.DenomType = '100.00' THEN A.d_100 
      WHEN B.DenomType = 'C0.01' THEN A.c_01 
      WHEN B.DenomType = 'C0.05' THEN A.c_05 
      WHEN B.DenomType = 'C0.10' THEN A.c_10 
      WHEN B.DenomType = 'C0.25' THEN A.c_25 
      WHEN B.DenomType = 'C0.50' THEN A.c_50 
      WHEN B.DenomType = 'C1.00' THEN A.c_100 
     END 
    FROM #VaultTotals A INNER JOIN #RecycleCashDenomsClone B ON A.importKey = B.importKey 
    WHERE A.identifier = @whereField  

不幸的是,这不起作用,没有错误信息,它只是不更新​​字段。如果可能的话,我想避免使用动态SQL,并且像上面提到的那样,我想避免使用不同的字段和where子句将此查询复制粘贴7次。

P.S.我测试了这两个变量varchar(10)并将它们设置为字符串。 ex./

DECLARE @updatedField VARCHAR(10) = 'startBal' 
DECLARE @whereField VARCHAR(10) = 'D0510' 
+0

这是一个很好的开始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

我看不出如何避免动态sql在这里。 – scsimon

+0

'UPDATE'与'SELECT'一样可以设置变量的值。这就是你的代码所做的。这不是“这不起作用,也不是错误信息”的情况,而是您没有预料到或检查的结果。这也是_optimistic programming_的一个例子:我希望它能做我想做的事情,例如'设置ColB = @ColName @Operator @ Constant'它应该知道前两个变量值应该被重新解释为源代码,但不是第三个。 – HABO

回答

0

这不是一个解决方案,而是一个想法来帮助你。

我不喜欢这个解决方案,因为大小写在所有情况下都是相同的,并且每次都更新所有字段。

UPDATE B 
    SET startBal = CASE WHEN @updatedField = 'startBal' THEN 
       CASE 
        WHEN B.DenomType = '1.00' THEN A.d_01 
        WHEN B.DenomType = '2.00' THEN A.d_02 
        WHEN B.DenomType = '5.00' THEN A.d_05 
        WHEN B.DenomType = '10.00' THEN A.d_10 
        WHEN B.DenomType = '20.00' THEN A.d_20 
        WHEN B.DenomType = '50.00' THEN A.d_50 
        WHEN B.DenomType = '100.00' THEN A.d_100 
        WHEN B.DenomType = 'C0.01' THEN A.c_01 
        WHEN B.DenomType = 'C0.05' THEN A.c_05 
        WHEN B.DenomType = 'C0.10' THEN A.c_10 
        WHEN B.DenomType = 'C0.25' THEN A.c_25 
        WHEN B.DenomType = 'C0.50' THEN A.c_50 
        WHEN B.DenomType = 'C1.00' THEN A.c_100 
       END 
      ELSE startBal END 
      ,startBal1 = CASE WHEN @updatedField = 'startBal1' THEN 
       CASE 
        WHEN B.DenomType = '1.00' THEN A.d_01 
        WHEN B.DenomType = '2.00' THEN A.d_02 
        WHEN B.DenomType = '5.00' THEN A.d_05 
        WHEN B.DenomType = '10.00' THEN A.d_10 
        WHEN B.DenomType = '20.00' THEN A.d_20 
        WHEN B.DenomType = '50.00' THEN A.d_50 
        WHEN B.DenomType = '100.00' THEN A.d_100 
        WHEN B.DenomType = 'C0.01' THEN A.c_01 
        WHEN B.DenomType = 'C0.05' THEN A.c_05 
        WHEN B.DenomType = 'C0.10' THEN A.c_10 
        WHEN B.DenomType = 'C0.25' THEN A.c_25 
        WHEN B.DenomType = 'C0.50' THEN A.c_50 
        WHEN B.DenomType = 'C1.00' THEN A.c_100 
       END 
      ELSE startBal1 END 
    FROM #VaultTotals A INNER JOIN #RecycleCashDenomsClone B ON A.importKey = B.importKey 
    WHERE A.identifier = @whereField 
+0

不幸的是,这是我想要避免的,我需要的@updatedField有7种不同的选项,通过这种方式来完成,它的复制和粘贴与硬编码选项几乎完全相同。 – haag1

+0

尝试使用sp_executesql(Transact-SQL)https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql –