将数据加载到维度日期表

时间:2017-04-16 17:54:15

标签: sql-server excel ssis

我有一个维度日期表,它有两个属性Month和Year,就像它写在脚本中一样,而month(mois)是我的主键。和我在源文件节目中的同一个月有不同的一年。那该怎么办呢 我做?把它们全部拿走还是应该使用不同的?

我的源文件是excel plus。我有来自表销售的数据(ord-date),我需要从数据库pubs获取。

PS:我正在使用ssis(visual studio)

这是我的来源日期

this is my source date

这是我创建维度日期表的原因,因为我们的教授告诉我们要创建它(不需要详细信息)

query

我知道如何从excel导入数据,我分割了日期。我只有当我加载到维度表时才发现问题。我的问题是我有例如2个日期(仅限月份和年份)05/1995和05/1995并且我想将它们加载到我的维度表中但我不能将我的月份作为我的主键。主键应该是唯一的

1 个答案:

答案 0 :(得分:1)

  • 您必须添加DataFlow Task,其中包含Excel Source - > Script Component - > 2x OLEDB Destination
  • 在脚本组件中,您必须添加包含2列Dim DateMonth的新输出Year,并将Synchronous Input属性设置为none

enter image description here

  • 第一个输出将包含包含其他数据的列,并且与输入缓冲区同步。
  • 在脚本中,您必须创建一个存储不同月份的列表,每次找到新月份时,都会生成Dim Date输出。

你的脚本应该是这样的。

Dim lstDates As New System.Collections.Generic.List(Of String)

Public Overrides Sub Input0Buffer_ProcessInputRow(ByVal Row As Input0Buffer)  


        If Not Row.Date_IsNull Then

            Dim strMonth As String = Row.Date.ToString("MM/yyyy")

            If Not lstDates.Contains(strMonth) Then

                With DimDateBuffer
                    .AddRow()
                    .Month = strMonth
                    .Year = Right(strMonth, 4)
                End With

                lstDates.Add(strMonth)

            End If 

        End If 
End Sub 

这样你就不会在Dimension表中出现重复,如果这个包定期运行你可以添加一个Execute SQL Task来获取数据仓库中的所有维度并将它们加载到脚本中创建的列表中使用Object变量的组件

  • 最后将DimDate输出列映射到第一个OLEDB destination,将第一个输出列映射到另一个目的地