2009-10-22 14 views
5

Quiero actualizar una tabla llamada Sorels_ext de una tabla llamada Sorels. El vínculo entre ellos es el fkey_id de Sorels_ext igual a la identity_column de la tabla de Sorels. Este es mi primer intento de una declaración Merge y estoy tratando de aprender la sintaxis.Necesita ayuda con la instrucción 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); 

Cuando ejecuto esto, me sale el siguiente error:

Error 10/22/2009 01:38:51 PM 0: 00: 00.000 de SQL Server Database error: Sintaxis incorrecta cerca de la palabra clave " EN'. 46 0

*** INFO AÑADIDO ******

Después sugirió que el primer punto de referencia, el código es el siguiente:

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

Ahora me sale el siguiente error:

Error 10/22/2009 2:03:29 PM 0: 00: 00.000 Error de base de datos de SQL Server: la lista de columnas de inserción utilizada en la instrucción MERGE no puede contener identificadores de varias partes. Use identificadores de parte única en su lugar. 55 0

******* añadió más INFO ****** Después de los ajustes de sugerencias, Tengo el siguiente:

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

me sale el error:

error 10/22/2009 2:46:51 PM 0: 00: 00.000 Error de base de datos de SQL Server: nombre de columna no válido 'FPARTNO'. 56 0

¿Qué estoy haciendo mal?

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

Enhorabuena. –

+0

Pequeña adición: no tiene sentido asignar 'fkey_id = identity_column', ya que su consulta ya ha verificado que tienen el mismo valor. –

Respuesta

4

Creo que tiene un alias a su datos de origen, así:

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

De acuerdo. El ejemplo OP utiliza un alias de tabla que no existe en ese JOIN. –

+0

Acabo de editarlo nuevamente con esa corrección y el nuevo error. Realmente aprecio tu paciencia. – DavidStein

+0

Lo actualicé de nuevo. Estoy usando los alias para hacer las cosas más fáciles y claras, y parecen estar teniendo el efecto opuesto. – DavidStein

0

Pruebe a retirar el "AS" en su ") como SOR"

5
INSERT (SORe.fkey_id, SORe.Color) 

será la siguiente:

INSERT (fkey_id, Color) 

columnas en la lista de inserción ca n solo se refiere a la tabla de objetivos. El analizador no espera ver un alias de tabla allí, y no sabe cómo resolverlo.

Si ve "column1", sabe que pertenece a la tabla de destino. Ve "table1.column1", no sabe lo que significa "table1", ya que "table1" como token está fuera del alcance.

+0

Estoy de acuerdo con Peter en este caso. – rfonn

+0

Eso funcionó, pero ¿puedes explicar por qué? – DavidStein

+1

Las columnas en la lista de inserción solo pueden hacer referencia a la tabla de destino, por lo que el analizador no espera ver un alias de tabla allí, no sabría cómo resolverlo. Ve "columna1", sabe que pertenece a la tabla de destino. Ve "table1.column1", no sabe lo que significa "table1". "table1" está fuera del alcance, por así decirlo. –

Cuestiones relacionadas