Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
SSIS Excel数据源-是否可以覆盖列数据类型?_Excel_Ssis - Fatal编程技术网

SSIS Excel数据源-是否可以覆盖列数据类型?

SSIS Excel数据源-是否可以覆盖列数据类型?,excel,ssis,Excel,Ssis,在SSIS中使用excel数据源时,每个列的数据类型都是从列中的数据派生的。有可能推翻这种行为吗 理想情况下,我们希望从excel源交付的每个列都是字符串数据类型,以便在数据流的后续步骤中对从源接收的数据执行数据验证 目前,ErrorOutput选项卡可用于忽略转换失败-相关数据为空,包将继续执行。但是,我们想知道原始数据是什么,以便为该行生成适当的错误消息。是的,您可以。只需进入Excel源上的输出列列表,并为每个列设置类型 要进入“输入列”列表,请右键单击Excel源,选择“显示高级编辑器”

在SSIS中使用excel数据源时,每个列的数据类型都是从列中的数据派生的。有可能推翻这种行为吗

理想情况下,我们希望从excel源交付的每个列都是字符串数据类型,以便在数据流的后续步骤中对从源接收的数据执行数据验证


目前,ErrorOutput选项卡可用于忽略转换失败-相关数据为空,包将继续执行。但是,我们想知道原始数据是什么,以便为该行生成适当的错误消息。

是的,您可以。只需进入Excel源上的输出列列表,并为每个列设置类型

要进入“输入列”列表,请右键单击Excel源,选择“显示高级编辑器”,单击标记为“输入和输出属性”的选项卡

一个可能更好的解决方案是使用派生列组件,您可以在其中为Excel中的每一列实际构建“新”列。这具有以下优点:

  • 你对转换成什么有更多的控制权
  • 您可以输入控制更改的规则(即,如果为null,则给我一个空字符串,如果有数据,则给我一个字符串形式的数据)
  • 您的数据源不直接绑定到流程的其余部分(即,您可以更改数据源,您需要做的唯一工作是在派生列中)

  • 如果Excel文件的第一行数据中有问题的列中包含一个数字,则SSIS引擎似乎会将该类型重置为数字类型。它一直在重置我的。我进入我的Excel文件,将数字改为“以文本形式存储的数字”,方法是在数字前面加上一个引号。它们现在作为文本阅读

    我还注意到,SSIS使用第一行忽略程序员指出的数据的实际类型(我甚至告诉Excel将整个列格式化为文本,但SSIS仍然使用数据,这是一堆数字),然后将其重置。一旦我在Excel文件中的第一行数据前面加上一个引号,我就认为这样做是正确的,但是没有,还有额外的工作要做

    事实上,即使SSIS外部数据源列现在具有DT_WSTR类型,它仍将43567192读取为4.35671E+007。因此,您必须返回Excel文件,在所有数字前加上单引号


    很差劲,微软!但这是你的解决方案。如果Excel文件不在您的控制之下,我不知道该怎么办。

    您可以使用数据转换组件转换为所需的数据类型。

    我在这里实现解决方案时遇到了问题-我可以按照说明操作,但它只会产生新的错误

    我通过使用数据转换实体解决了转换问题。这可以在SSIS工具箱的“数据流转换”下找到。我将数据转换放在Excel源和OLE DB目标之间,将Excel链接到数据C,将数据C链接到OLE DB,双击数据C以显示数据列列表。为问题列提供了新别名,并更改了数据类型列


    最后,在OLE DB目标的映射中,使用别名列名,而不是原始Excel列名。工作完成。

    Excel源代码是SSIS行为疯狂。SSIS通过读取前10行来确定particualr列中的数据类型。。这就是问题所在。如果在前10个ROE中有一个文本列的值为null,SSIS将数据类型设置为Int

  • 在工作表中插入虚拟行(首选第一行)。我喜欢通过脚本任务来完成这一任务,在SSIS连接到

  • 之前,您可以考虑使用某种服务来预处理文件。
  • 对于duummy行,您可以确定将根据需要设置数据类型

  • 使用Excel源读取数据并过滤掉伪行,然后再进行进一步处理


  • 我知道它有点破旧,但它可以工作:)

    我可以解决这个问题。在创建SSIS包时,我手动将特定列更改为文本(打开excel文件选择列,右键单击列,选择格式单元格,在数字选项卡中选择文本并保存excel)。 现在创建SSIS包并对其进行测试。它起作用了。现在尝试使用excel文件,其中该列未设置为文本

    它为我工作,我可以成功地执行包

    根据,问题在于SSIS Excel驱动程序根据前8行的读取值确定每列的数据类型:

    • 如果前8条记录包含相同数量的数字和字符类型,则优先级为数字
    • 如果前8条记录中的大多数是数字,则它将数据类型指定为数字,并且所有字符值都读取为空
    • 如果前8条记录中的大多数是字符类型,则它将数据类型指定为字符串,所有数值都读取为字符串 空值
    这篇文章概括了两件可以解决这个问题的事情:

  • 首先,将
    IMEX=1
    添加到Excel驱动程序连接字符串的末尾。这将允许Excel以Unicode格式读取值。但是,如果前8行中的数据是数字,这是不够的
  • 在注册表中,将
    HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
    的值更改为0。这将确保驱动程序查看所有行以确定列的数据类型

  • 我正在寻找类似问题的解决方案,但在互联网上找不到任何东西。尽管找到的大多数解决方案都在设计时工作,但当您想要自动化SSIS包时,它们就不工作了

    我解决了这个问题,并通过更改
    Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$]