2009-10-22 5 views
5

Je souhaite mettre à jour une table appelée Sorels_ext à partir d'une table appelée Sorels. Le lien entre eux est le fkey_id de Sorels_ext est égal à la colonne identity_column de la table Sorels. C'est ma première tentative d'une instruction Merge et j'essaie d'apprendre la syntaxe.Besoin d'aide avec l'instruction Merge

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

Quand je cours, j'obtiens l'erreur suivante:

Erreur 10/22/2009 13:38:51 0: 00: 00.000 base de données SQL Server Erreur: syntaxe incorrecte près du mot-clé ' SUR'. 46 0

*** INFO AJOUTÉE ******

Après la première solution a suggéré, le code est le suivant:

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

Maintenant, j'obtiens l'erreur suivante:

Erreur 10/22/2009 2:03:29 PM 0: 00: 00.000 Erreur de base de données SQL Server: La liste de colonnes d'insertion utilisée dans l'instruction MERGE ne peut pas contenir d'identifiants en plusieurs parties. Utilisez des identifiants de pièces uniques à la place. 55 0

******* PLUS D'INFO ****** AJOUTÉE Après ajustements de suggestions, je les suivantes:

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

Je reçois l'erreur:

erreur 10/22/2009 2:46:51 PM 0: 00: 00.000 Erreur de base de données SQL Server: Nom de colonne non valide 'FPARTNO'. 56 0

Qu'est-ce que je fais de mal?

**** Je l'ai eu !!! *****

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

Félicitations. –

+0

Petite addition: il ne sert à rien d'attribuer 'fkey_id = identity_column', car votre requête a déjà vérifié qu'ils ont la même valeur. –

Répondre

4

Je crois que vous avez un alias de votre données source comme ceci:

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

D'accord. L'exemple OP utilise un alias de table qui n'existe pas sur ce JOIN. –

+0

Je viens de l'éditer à nouveau avec cette correction et la nouvelle erreur. J'apprécie vraiment ta patience. – DavidStein

+0

Je l'ai mis à jour à nouveau. J'utilise les alias pour rendre les choses plus faciles et plus claires et elles semblent avoir l'effet inverse. – DavidStein

0

Essayez de prendre le "AS" dans votre ") DORS"

5
INSERT (SORe.fkey_id, SORe.Color) 

devrait lire:

INSERT (fkey_id, Color) 

Colonnes dans la liste d'insertion ca n se référer uniquement à la table cible. L'analyseur ne s'attend pas à voir un alias de table et ne sait pas comment le résoudre. S'il voit "column1", il sait qu'il appartient à la table cible. Il voit "table1.column1", il ne sait pas ce que "table1" signifie, puisque "table1" en tant que token est hors de portée.

+0

Je suis d'accord avec Peter sur celui-ci. – rfonn

+0

Cela a fonctionné, mais pouvez-vous expliquer pourquoi? – DavidStein

+1

Les colonnes de la liste d'insertion ne peuvent faire référence qu'à la table cible. L'analyseur ne s'attend donc pas à voir un alias de table, il ne sait pas comment le résoudre. Il voit "column1", il sait qu'il appartient à la table cible. Il voit "table1.column1", il ne sait pas ce que "table1" signifie. "table1" est hors de portée, pour ainsi dire. –

Questions connexes