2009-02-12 128 views
16

当在SSIS中使用Excel数据源时,每个单独列的数据类型都来自列中的数据。是否有可能重写这种行为?SSIS Excel数据源 - 是否可以重写列数据类型?

理想地,我们想从Excel源递送至是字符串数据类型每列,以便数据验证可以在数据流中后面的步骤中从所述源接收的数据来执行。

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

+0

我已经回答了一个在另一个类似于您的线索的问题,请参阅下面的链接。 http://dba.stackexchange.com/questions/39252/ssis-keeps-force-changing-excel-source-string-to-float/149378#149378 – user1968485 2016-09-15 05:42:56

回答

8

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

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

一个可能更好的解决方案是使用派生列分量在那里你可以真正建立“新的”列在Excel中的每一列。这具有以下优点:

  1. 您可以更好地控制转换的内容。
  2. 你可以把在控制权发生变化的规则(即,如果空给我一个空字符串,但如果有数据然后给我的数据作为一个字符串)
  3. 您的数据源不直接依赖于其他地区该过程(即,您可以更改源和唯一需要做的工作是在派生列中)
+0

罗伯特 - 感谢您的回复 - 我仍然有一个看到如何做到这一点的问题。我正在使用具有列形式的Excel Source组件,但它只有每个列的名称,而不是数据类型。就我所见,Excel连接管理器没有列形式。 – 2009-02-12 11:33:40

+0

我想你要去错误的属性编辑器(Excel源码有两个,一个简单和先进的)。我已经更新了答案,并稍微澄清了一些问题,并逐步找到了正确的地方。 – 2009-02-12 11:50:41

+7

现在到达 - 我已经使用高级编辑器,并将输入和输出列更改为全都具有DT_WSTR的数据类型。但是,错误输出列数据类型必须与输入列数据类型匹配,并且似乎无法更改这些...感谢您的持续帮助! – 2009-02-12 12:22:02

7

如果您的Excel文件在第一行数据中的问题列中包含一个数字,看来SSIS引擎会将类型重置为数字类型。它不停地重置我的。我进入我的Excel文件,并通过在他们面前放置单引号将数字更改为“以文本形式存储的数字”。现在他们被读作文本。

我还注意到SSIS使用第一行IGNORE程序员指出的是数据的实际类型(我甚至告诉Excel将整列格式化为TEXT,但SSIS仍使用数据,这是一个一堆数字),并重置它。当我在第一行数据前的Excel文件中加入一个单引号时,我认为它会正确,但不是,还有额外的工作。

事实上,即使SSIS外部数据源列现在有类型DT_WSTR,它仍然会读取43567192为4.35671E + 007。所以你必须回到你的Excel文件,并把所有数字前面的单引号。

漂亮的LAME,微软!但是有你的解决方案。如果Excel文件不在您的控制范围内,我不知道该怎么办。

-2

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

-1

我在这里实施解决方案时遇到了麻烦 - 我可以按照说明进行操作,但它只给出新的错误。

我通过使用数据转换实体解决了我的转换问题。这可以在数据流转换下的SSIS工具箱中找到。我在Excel Source和OLE DB Destination之间放置了数据转换,将Excel链接到Data C,将Data C链接到OLE DB,双击Data C打开数据列表。给问题列一个新的别名,并更改了数据类型列。

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

2

Excel来源是SSIS表现疯狂。 SSIS通过读取前10行来确定特定列中的数据类型。因此,这个问题。如果您在前10个roes中具有空值的文本列,则SSIS将数据类型视为Int。经过一番努力,这里有一个解决方法

  1. 在工作表中插入一个虚拟行(最好是第一行)。我喜欢做这个直通脚本任务,你可以考虑使用一些服务来预处理文件SSIS连接到它

  2. 随着duummy行之前,你是确保数据类型将根据您的需要进行设置

  3. 使用Excel源代码读取数据并在将其用于进一步处理之前过滤出虚拟行。

我知道这是一个有点简陋,但它的工作原理:)

0

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

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

8

根据this blog post,问题是,SSIS Excel驱动程序基于所述前8行的读取值确定每个列的数据类型:

  • 如果顶部8记录包含相等数目的数字和字符类型 - 然后优先级是数字
  • 如果大多数前8条记录都是数字,则它将数据类型指定为数字,并将所有字符值读取为NULL
  • 如果大多数前8条记录是字符类型它分配的数据类型为字符串,所有数值都理解为 空值

的职位概述了两件事情可以做,以解决这个问题:

  1. 首先,添加IMEX=1到年底你的Excel驱动连接字符串。这将允许Excel将值读为Unicode。但是,如果前8行中的数据是数字,这是不够的。
  2. 在注册表中,将HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows的值更改为0.这将确保驱动程序查看所有行以确定该列的数据类型。
1

我正在寻找类似问题的解决方案,但没有在网上找到任何东西。虽然大多数找到的解决方案都是在设计时运行的,但当您想要自动化SSIS包时,它们不起作用。

我解决了这个问题,并通过更改“Excel Source”的属性使其工作。默认情况下,AccessMode属性设置为OpenRowSet。如果您将其更改为SQL Command,则可以编写自己的SQL以根据需要转换任何列。

对我来说是SSIS治疗NDCCode列浮动,但我需要它作为一个字符串,所以我用下面的SQL:

Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$] 

enter image description here

enter image description here

相关问题