我們有一個面額表,它存儲每個唯一標識符關鍵字和每個面額的記錄,因此任何給定的唯一標識符關鍵字最多可以有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'
這是一個很好的開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
我看不出如何避免動態sql在這裏。 – scsimon
'UPDATE'與'SELECT'一樣可以設置變量的值。這就是你的代碼所做的。這不是「這不起作用,也不是錯誤信息」的情況,而是您沒有預料到或檢查的結果。這也是_optimistic programming_的一個例子:我希望它能做我想做的事情,例如'設置ColB = @ColName @Operator @ Constant'它應該知道前兩個變量值應該被重新解釋爲源代碼,但不是第三個。 – HABO