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

SSIS - Export Master-Detail data to a single flat file that contains both master and detail row

我有一个主控 table 的数据库及其详细信息 table,比方说

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

例如,如果我在 Master (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 的视图,并将其用作数据流的来源,但我不知道如何在导出的详细信息之前创建 header 行文件。

我怎样才能做到这一点?

您可以使用具有类似 SqlCommandOLEDB Source 来生成类型为 NVARCHAR 的列,其中包含您需要导出到平面文件的整行。

注意:平面文件必须仅包含 flat file connection manager 类型 DT_WSTR 中的一列,并且长度等于 4000 或更长(如果需要)并映射该列由 sql 命令生成

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

我在sql服务器做了一个小实验

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

结果是

重要提示

  • 在 SSIS 中,目标 Flat File 包含一个 DT_WSTR 类型的列,但实际上它包含 Tab 个分隔列。
  • 我用了in column,因为看起来你想把多个结构插入到一个平面文件中。所以这样做比较容易