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 行文件。
我怎样才能做到这一点?
您可以使用具有类似 SqlCommand
的 OLEDB 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,因为看起来你想把多个结构插入到一个平面文件中。所以这样做比较容易
我有一个主控 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')
我会像这样导出文件:
M 1MFieldVal1
D 1 1DFieldVal1
D 2 1DFieldVal2
M 2MFieldVal2
D 3 2DFieldVal3
到目前为止,我构建了一个连接 Master 和 Det 的视图,并将其用作数据流的来源,但我不知道如何在导出的详细信息之前创建 header 行文件。
我怎样才能做到这一点?
您可以使用具有类似 SqlCommand
的 OLEDB 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,因为看起来你想把多个结构插入到一个平面文件中。所以这样做比较容易