2009-10-22 25 views
5

Ich möchte eine Tabelle namens Sorels_ext aus einer Tabelle namens Sorels aktualisieren. Die Verbindung zwischen ihnen ist die fkey_id von Sorels_ext gleich der identity_column der Sorels-Tabelle. Dies ist mein erster Versuch einer Merge-Anweisung und ich versuche die Syntax zu lernen.Brauchen Sie Hilfe mit der Merge-Anweisung

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); 

Als ich das laufen lasse, erhalte ich folgende Fehlermeldung:

Fehler 2009.10.22 01.38.51 0: 00: 00.000 SQL-Server-Datenbank Fehler: Falsche Syntax nahe dem Schlüsselwort " AUF'. 46 0

*** ADDED INFO ******

Nach dem ersten Fix vorgeschlagen, wird der Code wie folgt:

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 bekomme ich folgende Fehlermeldung:

Fehler 22.10.2009 2:03:29 PM 0: 00: 00.000 SQL Server-Datenbankfehler: Die in der MERGE-Anweisung verwendete Spaltenliste darf keine mehrteiligen Bezeichner enthalten. Verwenden Sie stattdessen einzelne Teilkennzeichen. 55 0

******* MEHR INFO ADDED ****** Nach Anpassungen von Vorschlägen, ich habe folgendes:

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 den Fehler:

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?

**** Ich habe es !!! *****

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); 
+0

Herzlichen Glückwunsch. –

+0

Kleiner Zusatz: Es ist sinnlos, 'fkey_id = identity_column' zuzuweisen, da Ihre Abfrage bereits bestätigt hat, dass sie denselben Wert haben. –

Antwort

4

Ich glaube, Sie Ihre Quelldaten an Alias ​​haben etwa so:

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) 
+1

Einverstanden. Das OP-Beispiel verwendet einen Tabellenalias, der auf diesem JOIN nicht existiert. –

+0

Ich habe es gerade wieder mit dieser Korrektur und dem neuen Fehler bearbeitet. Ich schätze deine Geduld sehr. – DavidStein

+0

Ich habe es noch einmal aktualisiert. Ich verwende die Aliase, um Dinge einfacher und klarer zu machen, und sie scheinen den gegenteiligen Effekt zu haben. – DavidStein

0

Versuchen Sie, die "AS" in Ihrem ") AS SOR"

5
INSERT (SORe.fkey_id, SORe.Color) 
Herausnehmen

sollte lauten:

INSERT (fkey_id, Color) 

Spalten in der Einsatzliste ca n beziehen sich nur auf die Zieltabelle. Der Parser erwartet dort keinen Tabellenalias und weiß nicht, wie er zu lösen ist.

Wenn es "column1" sieht, weiß es, dass es zur Zieltabelle gehört. Es sieht "table1.column1", es weiß nicht, was "table1" bedeutet, da "table1" als Token außerhalb des Gültigkeitsbereichs liegt.

+0

Ich stimme mit Peter auf diesem. – rfonn

+0

Das hat funktioniert, aber können Sie erklären warum? – DavidStein

+1

Spalten in der Einfügeliste können sich nur auf die Zieltabelle beziehen, so dass der Parser dort keinen Tabellenalias sehen kann und nicht weiß, wie er gelöst werden kann. Es sieht "column1", es weiß, dass es zur Zieltabelle gehört. Es sieht "table1.column1", es weiß nicht, was "table1" bedeutet. "table1" ist sozusagen außerhalb des Geltungsbereichs. –