【问题标题】:SSIS - Export Master-Detail data to a single flat file that contains both master and detail rowSSIS - 将主从数据导出到包含主行和详细信息行的单个平面文件
【发布时间】:2017-03-30 20:10:25
【问题描述】:

比方说,我有一个带有主表和详细表的数据库

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

例如,如果我有 2 行在 Master (1,'MFieldVal1'),(2,'MFieldVal2') 和 3 行在 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 的视图,并将其用作数据流的源,但我不知道如何在导出文件中的详细信息之前创建标题行。

我怎样才能做到这一点??

【问题讨论】:

  • 只需使用order by ID, RecordType 即可确保行以正确的顺序显示

标签: sql-server ssis flat-file


【解决方案1】:

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

注意:平面文件必须仅包含 flat file connection manager 中类型为 DT_WSTR 的一列,并且长度等于 4000 或更高(如果需要)并将从 sqlCommand 生成的列映射到它

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 server中做了一个小实验

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 分隔列。
  • 我使用了 ine 列,因为您似乎想在一个平面文件中插入多个结构。所以这样做更容易

【讨论】:

  • 感谢您的快速回复!这个解决方案完全依赖SqlCommand,我的意思是:所有的格式化/转换工作都需要在SQL命令中完成,我不是SSIS专家,但我希望所有的数据操作工作都在SSIS数据中完成流程,但由于我不是专家,我可能错了,提供的解决方案是最佳实践。
  • 这种数据操作不需要使用数据流任务转换组件。而且很容易实现。
  • 尝试后给我反馈。如果它解决了你的问题,最好accept it
  • 我认为你是对的,而且格式化操作在 SQL 中也能更好地实现。我最终写了 2 个视图:一个用于标题数据,一个用于详细信息数据,每个字段都根据输出文件的需要进行格式化。在数据流中,我连接所有字段,然后“合并”它们并对它们进行排序,以使它们处于正确的顺序。最后,完全按照您上面给出的解决方案,我将获得相同的结果。我只是认为 SSIS 提供了更多的功能来格式化\操作数据。谢谢!
  • 乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 2019-04-23
  • 2019-12-09
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 2019-08-23
  • 2017-04-13
相关资源
最近更新 更多