2010-12-14 7 views
1

je dois écrire une seule déclaration pour insérer ou mettre à jour un enregistrement dans une seule table d'enregistrementdéclaration de fusion sur une table d'enregistrement unique

la déclaration de fusion me permet d'écrire ceci:

create table t1 (n int) 

-- insert into t1 (n) Values (1); -- uncomment to test the matched branch 

MERGE t1 AS P 
USING (SELECT 3 AS n) AS S 
ON 1 = 1 
WHEN MATCHED THEN 
    UPDATE SET n = S.n 
WHEN NOT MATCHED THEN 
    INSERT (n) 
    VALUES (S.n); 

select * from t1  

ce travail , mais je pense que le but de la condition 1 = 1 n'est pas très facile à comprendre. Existe-t-il une syntaxe différente pour insérer un enregistrement lorsque la table est vide ou mettre à jour l'enregistrement lorsqu'il existe déjà?

Répondre

1

L'autre option serait de le faire à l'ancienne.

if exists (select null from t1) 
    update t1 set n = 3 
else 
    insert into t1 (n) values (3) 
+0

Je suis d'accord. C'est plus lisible aussi. Je me demandais juste à propos de la syntaxe MERGE ... – sergiom

0

Remplacer

ON 1 = 1 

avec

ON S.n = P.n 
+0

Je pense que cela conduira à l'insertion d'un nouvel enregistrement quand S.n <> P.n, donc la table deviendrait plus d'un enregistrement – sergiom

0

Exemple de procédure récente je l'ai écrit à mettre à jour soit une ligne existante ou insérer une nouvelle ligne. La table a la même structure que MembershipEmailFormat la variable de table.

J'ai trouvé le plus simple de créer une variable table comme source dans la clause Using. Je me rends compte que le but principal des instructions de fusion est vraiment la fusion de plusieurs lignes entre deux tables. Mon cas d'utilisation est que j'ai besoin d'insérer une nouvelle adresse e-mail pour un utilisateur ou modifier et adresse e-mail existante.

CREATE PROCEDURE [dbo].[usp_user_merge_emailformat] 
     @UserID UNIQUEIDENTIFIER, 
     @Email varchar(256), 
     @UseHTML bit 
AS 
BEGIN 
    --SELECT @UserID='04EFF187-AEAC-408E-9FA8-284B31890FBD', 
    --  @Email='[email protected]', 
    --  @UseHTML=0 

    DECLARE @temp TABLE 
    (
      UserID UNIQUEIDENTIFIER, 
      Email varchar(256), 
      HtmlFormat bit 
    )  

    INSERT INTO @temp(UserID,Email, HtmlFormat) 
    Values(@UserID,@Email,@UseHTML) 

    SELECT * FROM @temp  

    MERGE dbo.MembershipEmailFormat as t 
    USING @temp AS s 
    ON (t.UserID = s.UserID and t.Email = s.Email) 
    WHEN MATCHED THEN UPDATE SET t.HtmlFormat = s.HtmlFormat 
    WHEN NOT MATCHED THEN INSERT VALUES(s.UserID,s.Email,s.HtmlFormat); 
END 
Questions connexes