2009-07-29 6 views
1

que je suis en train de modifier une dimension de type 2 en utilisant les éléments suivants (long) instruction SQL:suivi ce que la commande merge et sa sortie ne

INSERT INTO AtlasDataWarehouseReports.District 
(
    Col01, 
    Col02, 
    Col03, 
    Col04, 
    Col05, 
    Col06, 
    Col07, 
    Col08, 
    Col09, 
    Col10, 
    StartDateTime, 
    EndDateTime 
) 
SELECT 
    Col01, 
    Col02, 
    Col03, 
    Col04, 
    Col05, 
    Col06, 
    Col07, 
    Col08, 
    Col09, 
    Col10, 
    CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)) AS StartDateTime, 
    NULL AS EndDateTime 
FROM 
(
    MERGE AtlasDataWarehouseReports.District AS MergeTarget 

    USING Staging.District as MergeSource 
     ON MergeTarget.Col01 = MergeSource.Col01 
     AND MergeTarget.EndDateTime IS NULL 

    WHEN MATCHED 
     AND (
       MergeTarget.Col02 <> MergeSource.Col02 
       OR MergeTarget.Col05 <> MergeSource.Col05 
      ) 
    THEN 
     UPDATE SET MergeTarget.EndDateTime = CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)) 

    WHEN NOT MATCHED 
    THEN 
     INSERT 
     (
      Col01, 
      Col02, 
      Col03, 
      Col04, 
      Col05, 
      Col06, 
      Col07, 
      Col08, 
      Col09, 
      Col10, 
      StartDateTime, 
      EndDateTime 
     ) 
     VALUES 
     (
      MergeSource.Col01, 
      MergeSource.Col02, 
      MergeSource.Col03, 
      MergeSource.Col04, 
      MergeSource.Col05, 
      MergeSource.Col06, 
      MergeSource.Col07, 
      MergeSource.Col08, 
      MergeSource.Col09, 
      MergeSource.Col10, 
      CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)), 
      NULL 
     ) 
    OUTPUT $Action as MergeAction, MergeSource.* 
) AS MergeOutput 
WHERE 1=1 
    AND MergeOutput.MergeAction = 'UPDATE'; 

Je courais cela comme une partie de l'ETL qui charge mon entrepôt de données . Ce que je veux construire est un système de journalisation détaillé qui peut suivre tous les changements dans une table/fichier de journal etc.

Tout le travail qui est réellement fait pendant le MERGE et la SORTIE utilisée dans l'INSERT, est derrière le scènes. Je veux suivre toutes les colonnes et les valeurs qui ont participé à cette requête.

Y a-t-il un moyen pour moi de capturer ces données?

Répondre

1

Je crois que l'inconvénient de l'utilisation de l'instruction T-SQL MERGE ici est que vous allez obscurcir ce qui se passe réellement et donc l'introduction de la journalisation peut nécessiter un effort dupliqué.

Juste mes pensées mais vous semblez réinventer la roue un peu ici. SQL Server Integration Services (SSIS) offre des composants prédéfinis pour ces exigences de traitement exactes. Par exemple, vous pouvez utiliser le composant Slowly Changing Dimension Transformation existant, ou utiliser un certain nombre de composants de niveau inférieur pour implémenter votre propre solution personnalisée, mais intégrer ensuite la consignation.

+0

@John Sansom: Tu m'as manqué il y a quelques semaines! http://stackoverflow.com/questions/1132078/upsert-in-ssis. Maintenant, j'ai construit le tout dans les procédures stockées appelées à partir de SSIS. J'ai exécuté le magicien. La seule chose que je n'aimais pas était la maintenabilité du paquetage SSIS. Il utilise des commandes OLEDB pour cela, et Microsoft a bâclé royalement le nom de paramètre pour l'objet de commande OLEDB avec Param_0, Param_1. J'ai demandé à ce sujet ici http://stackoverflow.com/questions/1137355/alias-parameters-in-ssis. Jusqu'à présent, j'ai 15 Dimensions Type2 Dimensions qui utilisent MERGE. –

Questions connexes