【问题标题】:SSIS OLE DB Command data flow transformation SqlCommand size limitSSIS OLE DB Command 数据流转换 SqlCommand 大小限制
【发布时间】:2015-07-06 22:18:32
【问题描述】:

我在数据流中遇到了一种情况,我认为我已达到 OLE DB 命令数据流转换的 SqlCommand 属性的大小限制。让我给你设置:

我有一个包含几列的文本文件源。其中一列是包含超过 50,000 个字符的字符串对象。我编写了一个接受这些列的存储过程,包括被解析并作为 SQL 表中的几个新行添加的字符串对象。在 SQL Server Management Studio 中调用存储过程时它工作正常,我可以传入大量文本 (50k+)。

现在在我的 SSIS 数据流对象中,我有一个 OLE DB 命令转换,它调用作为参数传入列中的存储过程,包括字符串对象(DT_NTEXT 数据类型)。如果包含字符串的文本文件列少于 33,000 个字符,则数据流工作正常。一旦遇到字符串列超过 32,767 个字符大小的行,数据流就会触发截断错误,并且永远不会处理该行。

SQLCommand 属性只有 1 行是存储的 proc 调用:

EXEC usp_ParseDataColumns ?,?,?

最后一个参数是可以变得非常大的字符串对象。我假设转换在运行时将每个参数替换为行的数据,如果属性的值大小超过 32,767 个字符,它会截断并生成错误。

OLE DB 命令转换生成的错误输出是:

由于符号以外的原因无法转换数据值 不匹配或数据溢出。

我尝试搜索几种替代方法,包括使用变量,但不确定这是否是正确的路径。我正在使用 OLE DB 命令,因为我需要在之后对每一行执行其他转换。

我该如何解决这个问题,或者有更好的选择吗?

【问题讨论】:

    标签: sql ssis sqlcommand oledbcommand


    【解决方案1】:

    我从未遇到过 OLEDB 命令被截断的情况,这很奇怪。请尽可能发布完整的错误。

    至于修复,我建议稍微重新构建此数据流。将工作分解成逻辑片段并多次分段数据。所以,例如,

    • 不使用 OLEDB 命令,而是将数据插入临时表。
    • 当数据流任务完成时,我们执行 SQL 任务 在游标中运行该存储过程,或者更好的是,执行一个将 使用暂存数据作为源并执行基于集合的操作。
    • 最后,使用另一个执行 SQL 任务或另一个数据流来完成 操作(OLEDB 命令后发生的任何事情)

    我知道多次插入和读取数据似乎需要做更多的工作,但这种技术的性能总是优于具有逐行操作的大型复杂数据流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多