我正在使用以下(长)SQL语句修改Type 2维度:
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期间实际完成的所有工作和INSERT中使用的OUTPUT都在幕后。我想跟踪参与此查询的所有列和值。
我有什么方法可以捕获这些数据吗?
答案 0 :(得分:1)
我认为在这里使用T-SQL MERGE语句的缺点是你会模糊实际发生的事情,因此引入日志记录可能需要重复工作。
只是我的想法,但你似乎在这里重新发明轮子。
SQL Server Integration Services(SSIS)为这些精确的处理要求提供了预构建的组件。
例如,您可以使用现有的Slowly Changing Dimension Transformation组件,也可以使用多个较低级别的组件来实现自己的自定义解决方案,但随后会合并日志记录。