2017-09-19 2 views
-1

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' 
+0

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/ –

+0

Ich sehe nicht, wie Sie dynamische SQL hier vermeiden können. – scsimon

+0

'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

Antwort

0

Es ist keine Lösung, sondern eine Idee, die Ihnen hilft.

Ich mag diese Lösung nicht, weil der Fall für alle Bedingungen gleich ist und alle Felder jedes Mal aktualisiert.

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

Leider habe ich versucht, dies zu vermeiden, es gibt 7 verschiedene Optionen für @updatedField, die ich brauche, und indem ich es auf diese Weise mache, ist es fast genau so lang wie es nur mit den hartcodierten Optionen kopiert und eingefügt wird. – haag1

+0

Versuchen Sie, sp_executesql (Transact-SQL) https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql zu verwenden –

Verwandte Themen