Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 具有可变列号的SSIS平面文件_File_Ssis_Flat - Fatal编程技术网

File 具有可变列号的SSIS平面文件

File 具有可变列号的SSIS平面文件,file,ssis,flat,File,Ssis,Flat,SSIS在处理平面文件方面做了两件特别令人沮丧的事情,似乎应该有办法解决它们,但我想不出来。如果您定义了一个包含10列的平面文件,用CRLF分隔的制表符作为行结束标记,这将非常适用于每行正好有10列的文件。这两种痛苦的情景是: 如果有人在任何地方提供了一个第11列的文件,如果SSIS忽略它就好了,因为您还没有定义它。它应该只读取您定义的10列,然后跳到行尾标记,但它所做的是将任何附加数据与第10列中的数据连接起来,并将所有这些数据插入第10列。真的有点没用。我意识到这是因为第10列的分隔符不像其

SSIS在处理平面文件方面做了两件特别令人沮丧的事情,似乎应该有办法解决它们,但我想不出来。如果您定义了一个包含10列的平面文件,用CRLF分隔的制表符作为行结束标记,这将非常适用于每行正好有10列的文件。这两种痛苦的情景是:

  • 如果有人在任何地方提供了一个第11列的文件,如果SSIS忽略它就好了,因为您还没有定义它。它应该只读取您定义的10列,然后跳到行尾标记,但它所做的是将任何附加数据与第10列中的数据连接起来,并将所有这些数据插入第10列。真的有点没用。我意识到这是因为第10列的分隔符不像其他所有列那样是tab,而是CRLF,所以它只是抓住了CRLF上的所有内容,在这样做的时候用零替换额外的tab。在我看来,这并不明智

  • 如果有人提供的文件只有9列,则会发生更糟糕的情况。它将暂时忽略意外发现的CRLF,并用下一行开头的列填充任何缺少的列!“不聪明”在这里是一种轻描淡写的说法。谁会希望这种事发生?此时,文件的其余部分是垃圾

  • 无论出于何种原因,文件宽度的变化似乎并不不合理(当然,只有行末尾的变化才可以被合理地处理(少x列或多x列),但这似乎没有得到很好的处理,除非我遗漏了什么

    到目前为止,我们唯一的解决方案是将一行作为一个巨大的列(column0)加载,然后使用脚本任务使用它找到的分隔符来动态拆分它。这很好,只是它将行宽度限制为4000个字符(一个unicode列的最大宽度)。如果需要导入更宽的行(比如说有多个4000宽的列用于文本导入)然后您需要如上所述定义多个列,但是您必须严格要求每行的列数

    有没有办法克服这些限制?

    格伦,我感觉到你的痛苦:) SSI不能使列成为动态的,因为它需要存储每个列通过时的元数据,而且因为我们使用的是可以包含任何类型数据的平面文件,所以不能假设“不是最后一列的列”中的CRLF确实是它应该读取的数据行的结尾

    与SQL2000中的DTS不同,您不能在运行时更改SSIS包的属性

    您可以创建一个父包,读取平面文件(脚本任务),只读取平面文件的第一行以获取列数和列名。此信息可以存储在变量中

    然后,父包以编程方式加载子包(再次执行脚本任务),并更新子包的源连接的元数据 1.添加/删除列以匹配平面文件。 2.为列设置列分隔符,最后一列必须是与行分隔符匹配的CRLF 3.在数据流任务中重新初始化源组件的元数据(ComponentMetadata.ReinitializeMetadata())(以识别源连接中最近的更改)。 4.保存子ssis包

    有关以编程方式修改包的详细信息仅提供

    然后,父包只执行子包(执行包任务),它将使用新映射执行