关于DataWarehouse加载过程中的代理键

时间:2018-11-16 14:09:00

标签: sql-server tsql etl data-warehouse

当您执行从阶段表到事实和维度表的加载过程时,是否意味着您还相对于新行从阶段将代理键加载到维度表?

还是通过使用sql代码为表在维度表中创建新的代理键? (https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017)?

哪种方法正确?

其他信息:
*我是ETL和商业智能领域的新手
*我只使用T-SQL,没有使用SSIS。

谢谢!

1 个答案:

答案 0 :(得分:0)

问题不是很清楚。病态的尝试会根据您的“想法”回答,但最好是让对数据不熟悉的人清楚地知道这个问题,并提供示例数据。

我想您是在问是否需要在将事实表加载到维度表的同时将条目加载到事实表中。

通常,在将数据加载到事实表之前,将维成员加载到维表中。如果可能的话,这样做更容易。 我将依次使用的步骤是:

  • 在其自己的存储过程中向维度加载任何新成员。这样可以确保您现在拥有任何新成员的代理密钥。对所有尺寸都执行此操作。
  • 创建第二个存储过程以加载事实表。将登台表连接到维度表以获取代理键。下面的代码显示了一个维度的示例,但只是根据需要进行更多的联接以添加到更多维度。

下面的代码用人为的数据填充示例维和factStaging表,以显示如何获取代理键和要插入到事实表中的数据。

create table #factstaging
(
    dimension1Value nvarchar(20),
    factmeasure1 int,
    factmeasure2 int
)
create table #dimension1
(
    ID int identity(1,1),
    dimension1Value nvarchar(20)
)
insert into #dimension1
values
('d1 value 1'),
('d1 value 2'),
('d1 value 3')

insert into #factstaging
values
('d1 value 1',22,44),
('d1 value 1',22,44),
('d1 value 2',22,44),
('d1 value 3',22,44)

--contents of stored procedure to insert fact rows
select d1.ID as Dimension1SurrogateKey, s.factmeasure1,s.factmeasure2
from #factStaging s
join #dimension1 d1 on s.dimension1Value = d1.dimension1Value

注意:

  • 您的数据需要干净。
  • 如果事实是在维度数据之前到达的,则模式将有所不同,并且需要使用诸如后到来的维度模式之类的东西,这要复杂得多。