2009-07-23 4 views
1

Je gère un entrepôt de données. J'ai plusieurs tables de dimension dont la plupart sont de type-2 et d'autres de type-1.Mise à jour d'une dimension de type 2 avec la commande MERGE

J'ai été capable de comprendre comment utiliser MERGE pour gérer mes tables de dimension de type-1.

Je suis perplexe sur la façon de faire les tables de dimension de type-2.

Comment faire les deux, la mise à jour de EndDate et une insertion à l'aide de la commande MERGE?

Répondre

2

MERGE ne vous laissera malheureusement pas appliquer plusieurs actions à une seule condition, ou vous laissera opérer plusieurs fois sur une ligne.

Alors, ce que je fais est d'utiliser un emballage INSERT INTO le MERGE:

INSERT INTO DimTable 
SELECT ID, Name, StartDate, null as EndDate 
FROM 
    (
     MERGE DimTable AS tgt 
     USING StageTable AS src 
      ON tgt.id = src.id AND tgt.enddate IS NULL 
     WHEN MATCHED THEN 
      UPDATE SET tgt.enddate = src.startdate 
     WHEN NOT MATCHED THEN 
      INSERT INTO (ID, Name, StartDate) 
       VALUES (src.id, src.name, src.startdate) 
     OUTPUT $action as Action, src.ID, src.Name, src.StartDate 
    ) a 

WHERE 
    a.Action = 'UPDATE' 

La clé est la clause OUTPUT qui fait rediriger les lignes de sorte que vous savez exactement ce qui leur est arrivé. Une fonctionnalité géniale, vraiment.

+0

@Eric: en fait, il me permettra d'émettre plusieurs commandes sur un NON MATCH, mais ne me laissera pas avoir plusieurs commandes sur un MATCH. consultez cet exemple BOL ms-help: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_1devconc/html/952595a6-cf1d-4ff5-8927-66f9090cf79d.htm –

+0

Ce lien ne fonctionne pas pour moi, mais je l'a modifié pour utiliser une commande 'merge' enveloppée dans un' insert into'. J'ai effectivement utilisé cela, mais complètement effacé quand j'ai d'abord répondu. – Eric

+0

@Eric, mec .. vous êtes le BOMB –

Questions connexes