【问题标题】:SSIS Conversion Failure From Numeric Field to Date从数字字段到日期的 SSIS 转换失败
【发布时间】:2018-05-18 18:42:02
【问题描述】:

我在 AS400 表中有一个字段,它是一个数字(十进制 8)字段。其中,日期以YYYYMMDD 格式存储,例如20180518。

然后我在 MS SQL Server 中有一个阶段表,我在处理之前将这些数据转储到该表中。目标列的类型为 Date。

我无法让 SSIS 包相应地传递值。我们尝试做的是将数字字段拆分为字符串,然后抓取子字符串。然后连接这些部分以组装一个 MM/DD/YYYY 格式的字符串。

substring(myfield,5,2) || '-' || substring(myfield,7,2) || '-' || substring(myfield,1,4)

我们还尝试在 AS400 上使用 Date() 函数..

Date(substring(myfield,1,4) || '-' || substring(myfield,5,2) || '-' || substring(myfield,7,2))

由于这些选项都不起作用,然后我尝试使用 SSIS 转换工具来执行任务。我将查询改回,只将字段拉入,然后将其传递给数据转换工具。在该工具中,它首先将列视为小数。

[Input Column][Output Alias][Data Type]
[myfield     ][AliasMyField][decimal[DT_DECIMAL]]

然后我把它改成了

[Input Column][Output Alias][Data Type]
[myfield     ][AliasMyField][date[DT_DATE]]

似乎无论我们尝试哪个途径包都不会执行,我不断得到:

转换失败,因为数据值溢出了指定的类型。

【问题讨论】:

    标签: sql-server ssis db2-400


    【解决方案1】:

    您不需要抓取任何子字符串。如果您将 YYYYMMDD 格式的字符串插入 SQL Server 日期时间字段,则无论您的区域设置如何,它都会毫无问题地插入。

    编辑:解决此问题的明确方法是让您的数据流将数据导入临时表,该表将 8 位日期接收到 varchar 字段中,无需任何修改。

    然后使用 TRY_CONVERT() 将数据移动到最终表以将 varchar 转换为日期时间,如果无法转换特定值,则为 NULL。

    【讨论】:

    • 是的,应该。这就是为什么这让我感到困惑,我的数据测试插入到 SQL 中,而 SMS 中没有任何问题。但是在 VS2015 中,我的 dtsx 拒绝在没有上述错误的情况下运行。破解和倒退的做事方式是为了绕过 SSIS 错误。它不会直接从 OLEDB 加载到 OLEDB 而不抛出该错误。我添加了转换工具来尝试绕过它。似乎没有任何效果。
    • 您没有显示足够的 dtsx 详细信息来诊断问题。如果您已成功将 8 位数字转换为字符串,则插入应该不是问题。但是,如果 SQL Server 认为它正在接收一个整数,那将是一个问题。
    • 我不知道还能提供什么。 DB2 选择以字符串“05-21-2018”的形式出现(解析子字符串,然后重新组装成有效的字符串日期格式),然后它会因该错误而爆炸。它是一个直接的 OLEDB-OLEDB,它是最简单的数据流任务,我无法详细说明。然后我开始使用数据转换来尝试将其强制转换为数据值,并且炸弹也一样。
    • 数据流中每一步相关字段的 SSIS 数据类型是什么?当我的回答是不这样做时,你为什么要将数字解析成这样的字符串?
    • 即使在使用 DB2 Date() 转换值时也是十进制。在预览中(“05-21-2018”),但数据转换工具仍显示为十进制。我什至吹走了对象并重新添加它以防缓存。我无法将 DB2 字段视为 DATE 字段甚至字符串。我可以更改我的目标阶段表并在迁移到适当的表时进行转换,我将其作为备用选项,但 dtsx 应该 能够毫无问题地做到这一点;为什么这不起作用是没有意义的。由于返回字段是数字,它似乎停留在十进制数据类型上。
    【解决方案2】:

    可能有一个无效的日期“数字”,20180229、20171305、00000000 或 99999999...

    或者它可能是 i 的有效日期,但不是 SQL 服务器,例如 00010101 或 99991231(除非您使用较新的 date 或 datetime2 类型)

    您需要一个执行转换并捕获转换错误的函数替换有效日期或在可接受的情况下返回 NULL。

    当 NULL 不可接受时,我通常会做类似的事情

    < 00010101 ==> 00010101  
    > 99991231 ==> 99991231  
    = xxxx0229 ==> xxxx0228
    

    这些都是简单的...任何其他的你必须自己决定

    【讨论】:

    • 是的,这就是日期的含义,如您的示例中的数字整数。我尝试的解决方法是解析这些值的子字符串并将它们组装为字符串,将它们转换为日期,然后将它们加载到数据库中。如示例中, substring(myfield,5,2) || '-' ||子串(myfield,7,2) || '-' ||然后 substring(myfield,1,4) 将组装为“05-21-2018”作为字符串值。然后它爆炸了。这就是为什么它令人困惑和沮丧。 varchar 值“05-21-2018”将毫无问题地插入日期字段,但 SSIS 崩溃了。
    • @alykins,你没有抓住重点。问题是您的数字不能转换为有效日期。可能是 00000000 或 99999999。
    • 不,它们都是有效日期。在保存到 AS400 之前,它们被验证为有效日期。因此,虽然它们可能是“无效的”,因为它们被视为十进制并且它认为会有溢出,但“小数”都是有效的(如示例)。我的最终解决方案证实了这一点,即将阶段表数据类型更改为 int,然后在处理时转换为日期。我没有收到任何错误,并且可以验证所有日期。 dtsx 中的某些内容不理解为字符串值。
    猜你喜欢
    • 2019-10-20
    • 2012-12-18
    • 1970-01-01
    • 2013-03-13
    • 2013-09-16
    • 2017-04-30
    相关资源
    最近更新 更多