2017-09-19 40 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 –