Fusionner avec plusieurs mises à jour et des inserts

Fondamentalement, j'ai un Serveur SQL server 2008 R2 base de données. La base de données dispose d'une table appelée Nœud et le Lien. Lien contient une StartNodeId et EndNodeId relatives à un Id de Nœud. La base de données nécessite également une table de Lien entre un Nœud et un Lien pour accélérer la vérification de dire, est-ce Noeud lié à ce Lien ou dont les Nœuds sont liés à ce Lien. Le Lien de la table contient une clef d'Identité, NodeId et LinkId. Mon problème est que lorsque je fais mon insère je suis en train d'utiliser merge qui ne semblent pas être en mesure de faire ce que je suis en train

Quand j'ai essayé

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;

Je reçois le message d'erreur "Une action de type" when MATCHED "ne peut pas apparaître plus d'une fois dans une" mise à JOUR "clause d'une instruction MERGE"

Si j'essaie de l'insertion de Nœuds à Démarrage et de Fin des Nœuds separemment, par exemple

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

Je me retrouve avec des liens supprimés (pas surprenant) donc en gros je me demandais si quelqu'un connaissait un bon moyen de faire cela? Si possible, je voudrais être en mesure de le faire encore à l'aide d'une instruction merge

Grâce

Edit: j'ai trouvé une façon différente de la fusion de ces données à l'aide d'une autre source, le problème est maintenant résolu.

Pourquoi êtes-vous mise à jour TARGET.NodeId à tous? Vous semblez être mise à jour pour exactement la même chose que vous êtes en train de tester.

OriginalL'auteur Manatherin | 2011-01-24