我刚刚开始使用SSIS,并且已经给出了以下问题来处理:
我有一个从VMS应用程序导出的主/详细(各种)平面文件(获得文件重新格式化的可能性为零,或以不同方式提供输出)。文件内容是按位置定义的(我有文件定义可以使用,谢天谢地),就像这样
HD01 - Header record - 82 positions, 12 columns
IN01 - Invoice header - 438 positions, 54 columns
IN02 - Credit Note header - 438 positions, 33 columns
IN03 - Invoice detail - 507 positions, 41 columns
IN04 - Credit detail - 164 positions, 46 columns
HD01仅在文件顶部出现一次,而IN01 - IN04出现多次。
我可以使用平面文件源连接加载数据文件,但我需要将所有记录类型加载到各自的目标表中。我能做的最好的事情就是读取文件,并将每种记录类型的内容放入各种临时表中,每个表有2列:记录类型(HD01,IN01等),其余的数据文件中相应行的数据,但是从数据文件到表的字符转换会产生奇数字符(即:日期应该是黑色块)。
我想我的问题是双重的: 1 - 如何利用我所知道的数据格式将源数据文件正确地拆分为5个目标表? 2 - 我的角色翻译是怎么回事?
答案 0 :(得分:0)
1 - 如何将源数据文件拆分为5个目标表 正确地,利用我所知道的数据格式?
我相信,在这种情况下,如果输出格式或多或少是固定的,将行解析为单独的值并将数据加载到登台表是一种方法。
例如:
DECLARE @Table1 TABLE (line varchar(255));
INSERT INTO @Table1 VALUES
( 'HD01 - Header record - 82 positions, 12 columns'),
( 'IN01 - Invoice header - 438 positions, 54 columns'),
( 'IN02 - Credit Note header - 438 positions, 33 columns'),
( 'IN03 - Invoice detail - 507 positions, 41 columns'),
( 'IN04 - Credit detail - 164 positions, 46 columns')
SELECT LEFT(line,4) AS LineTypeCoded
, SUBSTRING(line, 8, CHARINDEX('-', line, 10)-8) AS LineTypeDescription
, SUBSTRING(line, 2+CHARINDEX('-', line, CHARINDEX('-', line)+1), CHARINDEX('position', line) - 2-CHARINDEX('-', line, CHARINDEX('-', line)+1)) AS Positions
, LTRIM(REPLACE(REPLACE(SUBSTRING(line, CHARINDEX(',', line, CHARINDEX('position', line))+1, 100), 'column', ''), 's', '')) AS Columns
,line AS EntireLine
FROM @Table1
或更优雅的方式:
SELECT
PARSENAME(calc.line1, 4) AS LineTypeCoded
, PARSENAME(calc.line1, 3) AS LineTypeDescription
, PARSENAME(calc.line1, 2) AS Positions
, PARSENAME(calc.line1, 1) AS PositionsColumns
, line1 AS EntireLine
FROM @Table1
CROSS APPLY (
SELECT REPLACE(REPLACE(REPLACE(REPLACE(line, ' - ', '.'),', ', '.'), 'columns', ''), 'positions', '') AS line1
) calc
所以最后的结果是:
解析数据时,在临时表中将行分配到5个差异表中是一项微不足道的任务
2 - 我的角色翻译是怎么回事?
它看起来像你的代码页问题。数据库的整理将与文件代码页匹配