2017-09-10 4 views
1
, égalés

J'utilise MERGE déclaration afin d'insérer l'entrée XML à la table de base de données SQL Server. Comment exécuter plusieurs conditions dans le bloc WHEN MATCHED. S'il vous plaît se référer au code ci-dessous.Utilisation de plusieurs déclarations dans

USING TableRelationship AS new 
    ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND old.ToRoleID = @RoleID 

WHEN MATCHED THEN 
    UPDATE 
     SET old.FromRoleID = new.FromRoleID 
    -- Condition 2 
    -- Condition 3 

Actuellement WHEN MATCHED il exécute cette ligne old.FromRoleID = new.FromRoleID. Comment puis-je exécuter les 3 lignes (-- Condition 2 and 3) dans la condition WHEN NOT MATCHED.

Ex:

C'est ce que j'attends. WHEN MATCHED Je veux juste mettre à jour le champ ancien (old.ThruDate = GETDATE()) et insérer un enregistrement à la même table. Je ne peux pas séparer ces déclarations par une virgule. SQL émet

Syntaxe incorrecte

MERGE INTO Party.TableRelationship AS old 
USING TableRelationship AS new ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND old.ToRoleID = @RoleID 

WHEN MATCHED THEN 
    UPDATE 
     SET old.ThruDate = GETDATE(), 
    INSERT (FromRoleID, ToRoleID, TableRelationshipTypeID) 
    VALUES (new.FromRoleID, new.ToRoleID, new.TableRelationshipTypeID); 

Merci.

+0

S'il vous plaît montrer le code pour les deuxième et troisième conditions (peu importe si elle ne le fait pas courir, montrez-nous la logique là-bas). –

+0

Peut-être lié (ou dupliquer) en fonction de ce qui est vraiment demandé ici: https://stackoverflow.com/questions/25848219/multiple-update-statement-in-sql-server-merge?rq=1 –

Répondre

2

Vous pouvez utiliser INSERT over DML pour y parvenir:

INSERT INTO tab_name(FromRoleID, ToRoleID, TableRelationshipTypeID) 
SELECT FromRoleID, ToRoleID, TableRelationshipTypeID 
FROM (
    MERGE INTO Party.TableRelationship AS old 
    USING TableRelationship AS new 
    ON new.TableRelationshipTypeID = old.TableRelationshipTypeID 
    AND old.ToRoleID = @RoleID 
    WHEN MATCHED THEN 
    UPDATE SET old.ThruDate = GETDATE() 
    OUTPUT $action, FromRoleID, ToRoleID, TableRelationshipTypeID 
) sub(action, FromRoleID, ToRoleID, TableRelationshipTypeID) 
WHERE action = 'UPDATE'; 

Gardez à l'esprit que cette méthode a quelques limitations plus d'informations: MS Connect

+1

@HarshaW Cela devrait fonctionner pour votre cas. Si vous préparez des exemples de données https://rextester.com, je pourrais vous fournir une démo de travail. – lad2025

0

Ce ne sont pas des conditions, ils sont des clauses de cession. Vous les séparer par des virgules, comme dans update:

USING TableRelationship AS new 
    ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND 
    old.ToRoleID = @RoleID 
    WHEN MATCHED THEN UPDATE 
     SET old.FromRoleID = new.FromRoleID, 
      <assignment 2>, 
      <assignment 3>; 
+0

J'ai modifié la question. Ici, je ne peux pas utiliser ','. Il dit erreur de syntaxe. J'ai posté tout le code. Jetez un coup d'oeil s'il vous plait. –

1

Ce n'est pas ce qu'est une déclaration de fusion est pour. Une instruction de fusion met à jour les enregistrements s'ils existent déjà (WHEN MATCHED THEN) ou insère des enregistrements s'ils n'existent pas (WHEN NOT MATCHED THEN). Note: Les instructions de fusion de sqlserver peuvent spécifier QUAND MATCHED deux fois, peut-être que vous utiliseriez ceci dans le but que l'un des appariements supprime les enregistrements de la cible qui correspondent à des éléments supplémentaires. critères, et l'autre spécifie une liste de colonnes à mettre à jour si le test logique supplémentaire est faux)

Si vous voulez mélanger et mettre à jour votre insertion et mise à jour lorsqu'un enregistrement est associé, vous devez utiliser autre chose comme une procédure stockée ou un déclencheur qui réagit à la mise à jour

Alternativement, si vous êtes juste poser des questions sur la façon dont la syntaxe d'une déclaration de fusion, vos directives d'insertion ont besoin t o être précédée ÉCHÉANCE pas couvertes ALORS ... INSERT

1

Vous ne peut faire - il est tout simplement pas pris en charge par déclaration de SQL Server MERGE.

Dans le WHEN MATCHED cas, vous pouvez seulement faire une déclaration UPDATE (ou DELETE) - vous ne pouvez pas avoir plusieurs déclarations différentes unes après les autres.

Vérifiez la official MSDN documentation for MERGE - il précise ce qui est possible et ce qui est pas pris en charge en détail:

Syntaxe:

MERGE 
    USING <table_source> ON <merge_search_condition> 
    [ WHEN MATCHED [ AND <clause_search_condition> ] 
     THEN <merge_matched> ] [ ...n ] 
; 

<merge_matched>::= 
    { UPDATE SET <set_clause> | DELETE } 

L'instruction MERGE peut avoir au plus deux clauses WHEN CORRESPONDANTE. Si deux clauses sont spécifiées, la première clause doit être accompagnée d'une ET clause.Pour une ligne donnée, la deuxième clause WHEN MATCHED n'est appliquée que si la première ne l'est pas. S'il y a deux clauses WHEN ASSORTIE, alors on doit spécifier une action UPDATE et un doit spécifier une action SUPPRIMER