2011-01-24 13 views
8

Básicamente tengo una base de datos de SQL Server 2008 R2. La base de datos tiene una tabla llamada Node and Link. El enlace contiene un StartNodeId y EndNodeId relacionado con un Id en Nodo. La base de datos también requiere una tabla de enlace entre el nodo y el enlace para una comprobación más rápida de, por ejemplo, si este nodo está relacionado con este enlace o qué nodos están relacionados con este enlace. La tabla de enlace contiene una clave de identidad, NodeId y LinkId. Mi problema es cuando estoy haciendo mis inserciones Estoy tratando de utilizar la combinación de declaraciones que no parecen ser capaces de hacer lo que estoy tratandoCombínese con múltiples actualizaciones e insertos

Cuando traté

MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET 
USING (SELECT Id, StartNodeId, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE 
ON (TARGET.LinkId = SOURCE.Id) 
WHEN MATCHED AND TARGET.NodeId = Source.StartNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.StartNodeId, 
       TARGET.LinkId = SOURCE.Id 
WHEN MATCHED AND TARGET.NodeId = Source.EndNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.EndNodeId, 
       TARGET.LinkId = SOURCE.Id 
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.StartNodeId THEN 
    INSERT (LinkId, NodeId) 
    VALUES (SOURCE.Id, SOURCE.StartNodeId) 
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.EndNodeId THEN 
    INSERT (LinkId, NodeId) 
    VALUES (SOURCE.Id, SOURCE.EndNodeId) 
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE; 

me sale el mensaje de error "Un la acción del tipo 'CUANDO SE HACE COINCIDIR' no puede aparecer más de una vez en una cláusula 'ACTUALIZAR' de una instrucción MERGE "

Si intento insertar nodos de inicio y nodos finales por separado p. ej.

--Insert Start Node To Link Relationships 
    MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET 
    USING (SELECT Id, StartNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE 
    ON (TARGET.NodeId = SOURCE.StartNodeId AND TARGET.LinkId = SOURCE.Id) 
    WHEN MATCHED THEN 
     UPDATE SET TARGET.NodeId = SOURCE.StartNodeId, 
        TARGET.LinkId = SOURCE.Id 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (LinkId, NodeId) 
     VALUES (SOURCE.Id, SOURCE.StartNodeId) 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE; 

    --Insert End Node To Link Relationships 
    MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET 
    USING (SELECT Id, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE 
    ON (TARGET.NodeId = SOURCE.EndNodeId AND TARGET.LinkId = SOURCE.Id) 
    WHEN MATCHED THEN 
     UPDATE SET TARGET.NodeId = SOURCE.EndNodeId, 
        TARGET.LinkId = SOURCE.Id 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (LinkId, NodeId) 
     VALUES (SOURCE.Id, SOURCE.EndNodeId) 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE; 

termino con enlaces va a eliminar (no sorprendente), así que básicamente me preguntaba si alguien sabía de una buena manera de hacer esto? Si es posible me gustaría ser capaz de hacerlo aún utilizando una instrucción de combinación

Gracias

Editar: He encontrado una forma diferente de la fusión de estos datos utilizando una fuente diferente, el problema ya está resuelto.

+0

¿Por qué está actualizando 'TARGET.NodeId' en absoluto? Parece que lo estás actualizando exactamente a lo mismo que intentas probar. –

Respuesta

17

Tal vez me falta algo, pero

El mensaje de error se queja de que no puede tener múltiples WHEN MATCHED por lo que podría convertir

WHEN MATCHED AND TARGET.NodeId = Source.StartNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.StartNodeId, 
       TARGET.LinkId = SOURCE.Id 
WHEN MATCHED AND TARGET.NodeId = Source.EndNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.EndNodeId, 
       TARGET.LinkId = SOURCE.Id 

a

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.NodeId = CASE 
           WHEN TARGET.NodeId = Source.StartNodeId 
           THEN SOURCE.StartNodeId 
           ELSE Source.EndNodeId 
           END, 
       TARGET.LinkId = SOURCE.Id 

Pero a medida que la primera rama del CASE se golpea cuando TARGET.NodeId = Source.StartNodeId y también establece TARGET.NodeId = Source.StartNodeId y de manera similar para la segunda rama, lo que parece simplificar t o

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id  
Cuestiones relacionadas