Wir haben eine Denominationstabelle, in der Datensätze nach Schlüssel und Nennwert gespeichert werden. Jeder eindeutige Schlüssel kann also bis zu 13 Zeilen enthalten, die die Aufteilung auf den Nennwert anzeigen 7 verschiedene Transaktionstypen innerhalb dieser Zeile. Ich könnte meine Abfrage einfach kopieren und einfügen (was gut funktioniert) 7 mal, jedes mit einer anderen SET und WHERE Klausel Kombination, aber das würde chaotisch und sehr lang aussehen.T-SQL Dynamisch änderndes Feld, das mithilfe einer IF-Anweisung aktualisiert wird
Die Abfrage:
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'
Was würde ich gerne tun ... Stellen Sie eine if-Anweisung, die @updatedField und @whereField (Varchars) zu den 7 verschiedenen Kombinationen und geben sie in die Abfrage ändert sich wie folgt :
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
Leider funktioniert das nicht, keine Fehlermeldung, es aktualisiert nur die Felder nicht. Ich möchte, wenn möglich, Dynamic SQL vermeiden, und wie ich bereits erwähnt habe, möchte ich vermeiden, diese Abfrage siebenmal mit einer anderen Feld- und WHERE-Klausel einzufügen.
P.S. Ich habe dies getestet, indem ich die beiden Variablen varchar (10) gemacht habe und sie auf Strings gesetzt habe. ex./
DECLARE @updatedField VARCHAR(10) = 'startBal'
DECLARE @whereField VARCHAR(10) = 'D0510'
Hier ist ein großartiger Ort, um zu beginnen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
Ich sehe nicht, wie Sie dynamische SQL hier vermeiden können. – scsimon
'UPDATE', wie' SELECT', kann den Wert einer Variablen setzen. Das ist, was dein Code tut. Es ist nicht der Fall, dass "das nicht funktioniert, keine Fehlermeldung", sondern ein Ergebnis, das Sie nicht erwartet oder überprüft haben. Es ist auch ein Fall von _optimistischer Programmierung_: Ich möchte, dass es macht, was ich will, z. 'setze ColB = @ColName @Operator @ Constant ', wo es _bekommen_ sollte, dass die ersten beiden Variablenwerte als Quellcode, nicht aber der dritte Code neu interpretiert werden sollen. – HABO