2009-07-29 4 views
1

Я модифицирование измерения типа 2, используя следующее (длинное) SQL заявления:Tracking, что команда MERGE и ее ВЫВОД сделали

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

Я бег это как часть ETL, которая загружает мое хранилище данных , Я хочу создать подробную систему регистрации, которая может отслеживать все изменения в таблице журналов/файлах и т. Д.

Все работы, которые фактически выполняются во время MERGE и OUTPUT, используемые в INSERT, находятся за сцены. Я хочу отслеживать все столбцы и значения, которые участвовали в этом запросе.

Есть ли способ захватить эти данные?

ответ

1

Я считаю, что недостатком использования инструкции MERGE T-SQL является то, что вы будете скрывать то, что на самом деле происходит, и поэтому введение регистрации может потребовать дублирования усилий.

Только мои мысли, но вы, кажется, немного изобретаете колесо здесь.

Службы интеграции SQL Server (SSIS) предлагают готовые компоненты для этих точных требований к обработке.

Например, вы можете использовать существующий компонент Slowly Changing Dimension Transformation, или вы можете использовать несколько компонентов нижнего уровня для реализации своего собственного решения, но впоследствии включить ведение журнала.

+0

@ Джон Сансом: Я пропустил вас несколько недель назад! http://stackoverflow.com/questions/1132078/upsert-in-ssis. Теперь я создал всю вещь в хранимых процедурах, вызванных из SSIS. Я запустил мастера. Единственное, что мне не понравилось, это ремонтопригодность пакета SSIS. Он использует команды OLEDB для этого, и Microsoft рояльно искажает имена параметров для объекта команды OLEDB с параметрами Param_0, Param_1. Я спросил об этом здесь http://stackoverflow.com/questions/1137355/alias-parameters-in-ssis. До сих пор у меня было 15 размерных размеров Type2, которые используют MERGE. –