7 Stimmen

Brauche Hilfe bei der Merge-Anweisung

Ich möchte eine Tabelle namens Sorels_ext aus einer Tabelle namens Sorels aktualisieren. Die Verbindung zwischen den beiden Tabellen besteht darin, dass die fkey_id der Tabelle Sorels_ext gleich der Spalte identity_column der Tabelle Sorels ist. Dies ist mein erster Versuch, eine Merge-Anweisung zu erstellen, und ich versuche, die Syntax zu lernen.

MERGE Sorels_ext AS SORe
USING (select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END from Sorels AS SOR)
ON  (SORe.fkey_id = SOR.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END
WHEN NOT MATCHED THEN
  INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, SORe.Color = select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END);

Wenn ich dies ausführe, erhalte ich den folgenden Fehler:

Fehler 10/22/2009 1:38:51 PM 0:00:00.000 SQL Server-Datenbankfehler: Falsche Syntax in der Nähe des Schlüsselworts 'ON'. 46 0

*** ZUSÄTZLICHE INFORMATIONEN ******

Nach der ersten vorgeschlagenen Korrektur sieht der Code wie folgt aus:

    MERGE Sorels_ext AS SORe
USING (select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END from Sorels) AS SOR
ON  (SORe.fkey_id = SOR.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END
WHEN NOT MATCHED THEN
  INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END);

Jetzt erhalte ich den folgenden Fehler:

Fehler 10/22/2009 2:03:29 PM 0:00:00.000 SQL Server-Datenbankfehler: Die in der MERGE-Anweisung verwendete Insert-Spaltenliste kann keine mehrteiligen Bezeichner enthalten. Verwenden Sie stattdessen einteilige Bezeichner. 55 0

******* HAT WEITERE INFORMATIONEN HINZUGEFÜGT ****** Nach Anpassungen von Vorschlägen, habe ich das Folgende:

    MERGE Sorels_ext AS SORe
USING (select SOR1.identity_column, CASE
        WHEN left(SOR1.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR1.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END as colors from Sorels as SOR1 ) as SOR 
ON  (SORe.fkey_id = SOR.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END
WHEN NOT MATCHED THEN
  INSERT (fkey_id, Color) VALUES (SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END);

Ich erhalte die Fehlermeldung:

Fehler 10/22/2009 2:46:51 PM 0:00:00.000 SQL Server-Datenbankfehler: Ungültiger Spaltenname 'FPARTNO'. 56 0

Was mache ich falsch?

**** I GOT IT!!! *****

MERGE Sorels_ext AS SORe
USING (select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END as colors from Sorels as SOR) SOR1  
ON  (SORe.fkey_id = SOR1.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR1.identity_column, SORe.Color = SOR1.colors
WHEN NOT MATCHED THEN
  INSERT (fkey_id, Color) VALUES (SOR1.identity_column, SOR1.colors);

6voto

Peter Radocchia Punkte 10410
INSERT (SORe.fkey_id, SORe.Color) 

sollte lauten:

INSERT (fkey_id, Color) 

Die Spalten in der Einfügeliste können sich nur auf die Zieltabelle beziehen. Der Parser erwartet dort keinen Tabellenalias und weiß nicht, wie er ihn auflösen soll.

Wenn er "Spalte1" sieht, weiß er, dass sie zur Zieltabelle gehört. Sieht sie "table1.column1", weiß sie nicht, was "table1" bedeutet, da "table1" als Token außerhalb des Anwendungsbereichs liegt.

4voto

rfonn Punkte 2091

Ich glaube, Sie müssen Ihre Quelldaten wie folgt aliasieren:

USING (select SOR.identity_column, 
   CASE  WHEN left(SOR.FPARTNO, 2) = 'BL' 
   THEN 'Blue'        
   WHEN left(SOR.FPARTNO, 2) = 'RD' 
   THEN 'Red'        
   ELSE 'White'      
   END from Sorels AS SOR) **AS SOR** ON  (SORe.fkey_id = SOR.identity_column)

0voto

VinPepe Punkte 561

Versuchen Sie, das "AS" in Ihrem ") AS SOR" zu entfernen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X