2017-08-11 31 views
0

我正在构建一个SSIS软件包以将数据从BMC Remedy数据库(通过AR系统ODBC驱动程序)提取到我的SQL Server数据库中的表中。请注意,处理此数据源时存在一些特殊的限制。ssis dt_text列导致软件包挂起

我遇到的问题是我需要拉入的一列显示为dt_ntext(Unicode文本流)。该字段的数据类型(在TOAD中查看时)是“longvarchar”。该字段可以包含数千个字符的字符串。

只要省略这一列,我可以将所有其他字段导入到我的SQL Server表中。如果我包括这个,那么包无限期地挂起(在BIDS和在服务器上的生产中)。我已经让它运行了超过12个小时,并且从未取得任何进展。没有这一列,它需要一分钟。在BIDS中,我可以看到它挂在数据流任务的“源”步骤上,“执行阶段开始”。它挂在那里,不管目的地是什么(相同的结果转储到文本文件)。

我不需要来自该字段的所有数据。前200个字符实际上就足够了。但是,我没有选择更改我的源SQL语句,因为没有函数(即子字符串)允许(上述限制之一)。我试着在源文件上打开高级编辑器,并将该列的输出属性更改为长度为200的Unicode字符串。它不会导致错误,但结果是相同的(挂起)。我认为这意味着数据仍然需要“引入”,然后截断为200,这对我没有好处。

数据不是那么大......我可以在TOAD中运行查询,并在一分钟内返回所有行,而不会冒烟从我的机器中流出。因此,我觉得这是某种SSIS优化问题。

我看到它的方式,我需要两件事情之一。 1)在数据进入内存之前截断数据(在我的SELECT语句中不这样做),或者2)对我的包进行一些配置更改(缓冲区大小/行?),以便它可以运行在合理的数量的时间。我不知道如何实现这些。任何指导将不胜感激。

感谢, 埃里克

+0

是否有可能用脚本任务替换源代码?通过代码接近领域可能会让您更好地控制发生的事情。 – Greenspark

+0

如,在代码中创建一个记录集,然后遍历并将每个追加到我的数据库?这可能会奏效,但不知道效率如何。我会调查.. –

+0

没有太多的运气与此。我循环遍历记录集,并且当我到达特定行中有问题的字段(Work_Log)时,任何尝试读取数据都会导致代码挂起。例如: strTemp = Mid(dr(“Work_Log”),1,100) –

回答

1

最后,我不是能够在Visual Studio/BIDS二千零十二分之二千零八设计师之内解决这个问题。但是,我们正在迁移到SQL 2016.作为该过程的一部分,我们安装了具有“ODBC源”对象(与之前可用的ADO Net源相对)的SSDT 2015。一旦我切换到ADO Net Source,长列不再导致程序包挂起。

但值得注意的是,我在我的数据流中使用数据转换步骤将文本unicode文本流转换为字符串。我还截断了数据转换的输出,如下所示:右键单击数据转换步骤,选择“高级编辑器”,转到输入和输出属性,转到数据转换输出 - >输出列 - >复制Work_Log( Work_Log是我有问题的列名称),将TruncationRowDisposition更改为RD_IgnoreFailure,将DataType更改为字符串[DT_STR]并将Length更改为500.然后将Data Conversion步骤连接到输出并使用“Copy of”列,而不是原始列。我不是100%确定截断是否有必要避免我得到的错误,但是我的目的地已经只设置了500个字符,就像我的情况一样,我知道我需要的数据将在头几百个字符内,但认为无论如何都值得一提。

我还注意到一些有趣的事情。我的ODBC源任务显示一个感叹号(警告)。当我把鼠标悬停在它上面时,我看到警告:“Row by fetch方法被执行,因为表中有LOB列,Column Work_Log是LOB。我在2008/2012年的设计师中没有看到这个(或任何类似的东西),所以显然新的ODBC源代码足够聪明,可以更宽松地处理宽列(Row by Row?)。我不确定在这种模式下运行是否存在负面/性能成本,但在我的情况下它运行良好。