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.
¿Por qué está actualizando 'TARGET.NodeId' en absoluto? Parece que lo estás actualizando exactamente a lo mismo que intentas probar. –