【问题标题】:SSIS Excel Data Source - Is it possible to override column data types?SSIS Excel 数据源 - 是否可以覆盖列数据类型?
【发布时间】:2010-10-07 03:36:45
【问题描述】:

在 SSIS 中使用 excel 数据源时,每个单独列的数据类型都是从列中的数据派生的。是否可以覆盖此行为?

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

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

【问题讨论】:

标签: excel ssis


【解决方案1】:

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

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

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

  1. 您可以更好地控制要转换的内容。
  2. 您可以输入控制更改的规则(即,如果 null 给我一个空字符串,但如果有数据则给我作为字符串的数据)
  3. 您的数据源与流程的其余部分没有直接关联(即,您可以更改源,而您需要做的唯一工作是在派生列中)

【讨论】:

  • 罗伯特 - 感谢您的回复 - 我仍然无法了解如何执行此操作。我正在使用具有列表单的 Excel 源组件,但这只有每列的名称,而不是数据类型。据我所知,Excel 连接管理器没有列形式。
  • 我想你走错了属性编辑器(Excel源码有两个,一个简单的和一个高级的)。我已经更新了答案,提供了更多的说明和逐步到达正确的位置。
  • 现在到达那里 - 我使用了高级编辑器并将输入和输出列更改为都具有 DT_WSTR 数据类型。但是,错误输出列数据类型必须与输入列数据类型匹配,并且似乎无法更改这些...感谢您的持续帮助!
  • 为什么这个问题被标记为已回答?上面的评论明确指出这是行不通的。
  • 我们需要设置source列类型,而不是输出类型。
【解决方案2】:

如果您的 Excel 文件在第一行数据的相关列中包含数字,则 SSIS 引擎似乎会将类型重置为数字类型。它一直在重置我的。我进入我的 Excel 文件并通过在它们前面放置一个单引号将数字更改为“存储为文本的数字”。它们现在被读取为文本。

我还注意到 SSIS 使用第一行来忽略程序员指示的数据的实际类型(我什至告诉 Excel 将整列格式化为 TEXT,但 SSIS 仍然使用数据,这是一堆位数),并重置它。一旦我通过在我的 Excel 文件中将单引号放在第一行数据中的数字前面来解决这个问题,我认为它会正确,但不,还有额外的工作。

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

微软,太蹩脚了!但是有你的解决方案。如果 Excel 文件不在您的控制之下,我不知道该怎么办。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果 SSIS 以其无限的智慧确定列是数字的,读取文本值将导致数据源失败。没有机会向下游转换数据。
    【解决方案4】:

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

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

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

    【讨论】:

    • 您似乎忘记链接到您引用的解决方案
    • 这是对 Farouq 两年前的建议的阐述,也有同样的问题。
    • 是的,这是一个详尽的说明 - 展示了使流程正常运行所需的所有步骤 - 它确实有效。在确定它是错误的并且需要投反对票之前,您是否尝试过?
    • 这确实和其他解决方案有同样的问题(是的,我试过了)。问题是excel源将INPUT上的数据类型确定为excel源。当它到达输出或下一个对象(如数据转换)时,为时已晚。就我而言,如果前八行是六个字符串和两个数字,则数字为空。我尝试使用 Alok B 的解决方案来修复它,使其成为编写查询的 SQL 命令。这可能有效,但 Windows 8 + Visual Studio 2017 + 最新的 BIDS 每次我使用它达到某个点时都会崩溃。
    【解决方案5】:

    Excel 源代码是 SSIS 表现得很疯狂。 SSIS通过读取前10行来确定特定列中的数据类型..因此问题。如果您的文本列在前 10 个 roes 中有空值,则 SSIS 将数据类型设为 Int。有点挣扎,这里有一个解决方法

    1. 在工作表中插入一个虚拟行(最好是第一行)。我更喜欢通过脚本任务执行此操作,您可以考虑在 SSIS 连接到文件之前使用一些服务来预处理文件

    2. 使用虚拟行,您可以确定数据类型将根据需要设置

    3. 使用 Excel 源读取数据并过滤掉虚拟行,然后再进行进一步处理。

    我知道这有点破旧,但它有效:)

    【讨论】:

      【解决方案6】:

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

      它对我有用,我可以成功执行包。

      【讨论】:

        【解决方案7】:

        根据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。这将确保驱动程序查看所有行以确定列的数据类型。

        【讨论】:

          【解决方案8】:

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

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

          对我来说,SSIS 将 NDCCode 列视为浮点数,但我需要将其作为字符串,因此我使用了以下 SQL:

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

          【讨论】:

          • 我赞成,因为理论上这个解决方案是可行的。我试过了,但 Windows 8 + Visual Studio 2017 + 最新的 BIDS 每次我达到某个点时都会崩溃。所以我不能确定
          【解决方案9】:

          这应该很容易解决,只需取消选中“第一行作为列名”框,所有数据将被收集为文本数据类型。这种选择的唯一缺点是您必须管理自动名称(列 1、2 等)中的列名称并处理包含列名称的第一行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-11
            • 2023-03-27
            • 1970-01-01
            • 2012-07-01
            • 2015-08-20
            相关资源
            最近更新 更多