平面文件到SQL Server(批量插入)ODI 11g知识模块,仅从平面文件加载一半的记录

时间:2019-07-18 21:03:31

标签: sql-server bulkinsert bcp data-integration oracle-data-integrator

我正在使用Oracle Data Integrator 11g接口将包含超过一百万条记录的平面文件接口到SQL Server表。鉴于使用一般知识模块存在一些性能问题-我利用平面文件到SQL Server(批量插入)LKM的方法大大提高了接口性能,因为ODI代理使用SQL Server上的本机BCP实用工具批量加载记录

知识模块为ODI代理创建一个非常基本的批量插入查询,然后执行BCP实用程序。我拥有的平面文件来自Oracle PBCS-我们使用ODI 11g通过接口进行映射。由于平面文件的格式,我们在ODI平面文件模型中使用|的文本定界符。 (管道)和字段分隔符“”,以确保包含由“”包围的多个管道的字段成为一个数据元素,而不是被分隔符分解为子组件。

例如,一条看起来像

的记录
FY19|ContractX|FundX|"BOCX|ProgramX|VersionX|ScenarioX"

这将作为(以空格分隔的列)映射到SQL Server表中。

FY19 ContractX FundX BOCX|ProgramX|VersionX|ScenarioX 

代替

FY 19 ContractX FundX BOCX ProgramX VersionX ScenarioX

因此,在适当情况下,由于“字段分隔符”,它映射到较少的字段列。

由管道分隔的所有其他不包含“”的字段均视为定界元素。通常(对于SQL Server的平面文件,不使用SQL Server bcp实用程序,而是使用ODI的本机接口技术)这就像一种魅力,可以确保如上所述发生。

但是,当我们执行接口时,大容量插入会做两件事。

  1. BCP实用程序仅加载平面文件的一半记录。平面文件编码为UTF-8,并且使用竖线分隔。我已经阅读了一些内容(所有列和列的值都匹配,因此文件本身很好)-不知道是否有快速简便的脚本可以让我以以下方式格式化文件:格式化后-SQL Server批量插入然后将正确加载。成功加载到SQL Server表中的记录是乱序的和随机的(即使不是远程也不是基于平面文件的顺序),这也无济于事。

    这显然是最大的问题–需要首先解决此问题。

  2. 第二个问题是通过ODI LKM的BCP实用程序似乎“真正强大”,因为它忽略了我在ODI平面文件模型中定义的字段分隔符“”,并解析出包含多个管道的字段全部在“”之内。在不使用BCP的普通知识模块中-由“”包围并包含多个管道的字段未划分为单独的组件。我注意到,即使ODI平面文件模型将字段分隔符指定为“ –创建的批量插入sql查询也不会将其包含在SQL代码中。仿佛批量插入忽略了该字段分隔符(似乎可以识别|字段分隔符)

给我的印象是,我将必须编写自己的自定义BULK INSERT sql语句-我真的很满意-以确保上述两个问题都得到纠正。我正在寻找是否有人对解决这两个问题的批量插入查询有任何了解。

我试图尝试更改分隔符和平面文件上的编码-无济于事。有一些文献来格式化文件-但我需要ODI才能逐步执行此操作,因为即使我们不使用LKM,它仍然会自动执行。

我的想法是我需要

  1. 自定义批量插入脚本,我将其插入到ODI中执行或

  2. 我需要创建一个自定义知识模块。

我更喜欢做1.,但是需要构建脚本。

这是ODI通过声明式设计执行的,该声明式设计对应于向SQL Server(批量)FLM的平面文件。

BULK INSERT BFS_DM.ODI_Work.TC$_0Cld_Ess_SpendPln_Final     
FROM 'E:\EPM_Cloud/Exports/BUD_PLN/Data/Export_SpendPlan_BI_BUD_PLN.txt'     
WITH
    (
     CODEPAGE  = 'ACP' 
     , DATAFILETYPE  = 'char '
     , FIELDTERMINATOR  ='|' 
     , FIRSTROW =2
     , TABLOCK 
    )

如您在上面的代码中所看到的那样,该代码是由接口生成的-管道定界符在那里,但似乎没有选择“字段分隔符”作为考虑因素。因此最终将什么加载到表中成功的记录是将每个字段加载到由|分隔的列中。

此代码也仅加载一半的记录-想知道如何在上面的大容量插入中添加一些额外的代码行来解决该问题。

Firstrow = 2,因为文件中存在标题。

1 个答案:

答案 0 :(得分:1)

您需要在批量插入语句中使用格式文件。这是必需的,因为SQL BCP不允许考虑数据中包含的引号来隐藏/屏蔽数据中显示的给定字段终止符。另外,您将需要自定义(单个)字段终止符(并非所有字段都将使用相同的值来终止...就像您当前使用的“ |”一样。)

使用BCP格式文件,可以为传入文件指定自定义字段终止符。每个字段都在格式文件中被调出,因此每个字段都有自己定义的终止符。例如,您的第三个字段将以“ | \””而不是“ |”结尾(“ \”将转义包含在数据中的双引号,因此不会将其视为包含字段的真正的dbl引号格式文件中的终止符。

同时,您的第4列将不再以“ |”结尾但是现在将以“ \” \ r \ n“终止(假设您使用的是标准的crlf终止符。)再次,这里的第一个和最后一个双引号是bcp从格式文件读取的实际dbl引号包含定界符(由于我们位于最后一个字段,所以现在为“行”定界符)。您必须在其中用“ \”字符转义dbl引用。\ r \ n是crlf的标准bcp表示。

相关问题