SSIS - 将Master-Detail数据导出到包含主行和详细行的单个平面文件

时间:2017-03-30 20:10:25

标签: sql-server ssis flat-file

我的数据库带有一个包含详细信息表的主表,让我们说

Master (ID, MField1)
Det    (ID, IDMaster, DetField1)

我需要导出一个固定列大小的平面文件,其中包含主行和详细信息行,这些文件位于记录的下方'结构:

主记录:

Position    Desc        Length    Default
 1           RecordType  1         'M'
 2           ID          10
 3           MField1     10

详细记录:

Position    Desc        Length    Default
 1           RecordType  1         'D'
 2           ID          10
 3           MasterID    10
 4           MField1     10

例如,如果我在主(1,'MFieldVal1'),(2,'MFieldVal2')中有2行而在Det (1,1,'DFieldVal1'),(2,1,'DFieldVal2'),(3,2,'DFieldVal3')中有3行

我导出这样的文件:

M         1MFieldVal1
D         1         1DFieldVal1
D         2         1DFieldVal2
M         2MFieldVal2
D         3         2DFieldVal3

到目前为止,我构建了一个连接Master和Det的视图,并将其用作数据流的来源,但我不知道如何在导出文件中的详细信息之前创建标题行。

我怎样才能实现这个目标?

1 个答案:

答案 0 :(得分:0)

您可以使用类似OLEDB Source的{​​{1}}来生成类型为SqlCommand的列,其中包含您需要导出到平面文件的整行。

注意:如果需要,平面文件必须只包含NVARCHARflat file connection manager中的一列,长度等于DT_WSTR或更高,并映射从sqlCommand生成的列它

4000

我在sql server中做了一个小实验

SELECT  CAST(DataRow as NVARCHAR(4000))  as DataRow FROM (

SELECT ID ,'M' as RowType ,  
       'M   ' + CAST(ID as VARCHAR(255)) + '    ' + MField1  AS DataRow 
FROM Master

UNION ALL

SELECT IDMASTER ,'D' as RowType,  
       'D   ' + CAST(ID as VARCHAR(255)) + '    ' + CAST(IDMASTER as VARCHAR(255)) + '  ' + DetField1  AS DataRow  
FROM Det
        ) AS TBL
ORDER BY ID ASC, RowType DESC

结果是

enter image description here

重要提示

  • 在SSIS中,目标CREATE TABLE #Master (ID INT, MField1 VARCHAR(255)) CREATE TABLE #Det (ID INT, IDMaster INT , DetField1 VARCHAR(255)) INSERT INTO #Master(ID, MField1) VALUES (1,'MFieldVal1'),(2,'MFieldVal2') INSERT INTO #Det(ID, IDMASTER,DetField1) VALUES (1,1,'DFieldVal1'),(2,1,'DFieldVal2'),(3,2,'DFieldVal3') SELECT CAST(DataRow as NVARCHAR(4000)) as DataRow FROM ( SELECT ID ,'M' as RowType , 'M ' + CAST(ID as VARCHAR(255)) + ' ' + MField1 AS DataRow FROM #Master UNION ALL SELECT IDMASTER ,'D' as RowType, 'D ' + CAST(ID as VARCHAR(255)) + ' ' + CAST(IDMASTER as VARCHAR(255)) + ' ' + DetField1 AS DataRow FROM #Det) AS TBL ORDER BY ID ASC, RowType DESC 包含一个Flat File类型的列,但实际上它包含DT_WSTR个分隔的列。
  • 我使用了ine列,因为您似乎想要将多个结构插入到一个平面文件中。所以这样做更容易