SSIS OLE DB命令数据流转换SqlCommand大小限制

时间:2015-07-06 22:18:32

标签: sql ssis sqlcommand oledbcommand

我遇到了数据流中的情况,我认为我已达到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命令,因为我需要在每一行之后执行其他转换。

我如何解决这个问题还是有更好的选择?

1 个答案:

答案 0 :(得分:1)

我从未遇到OLEDB命令被截断,这是一个奇怪的命令。请尽可能发布完整的错误。

至于修复,我建议稍微重新构建这个数据流。将工作分解为逻辑部分并多次分阶段处理数据。所以,例如,

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

我知道这似乎是多次插入和读取数据的工作,但这种技术总是比逐行操作的大型复杂数据流更好。