【发布时间】:2014-12-31 11:22:09
【问题描述】:
我有一个 SSIS 包,它间歇性地失败并出现一些错误,其中两个信息最丰富的是:
DFT_Play总结 SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0” Hresult:0x80004005 描述:“无效的日期格式”。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0” Hresult:0x80004005 描述:“无效的日期格式”。**
DFT_Play总结 输入“OLE DB 目标输入”(2121) 上的输入列“dtCreated”(2129) 出现错误。返回的列状态为:“转换失败,因为数据值溢出了指定的类型。”。**
源数据库和目标数据库都是 SQL Server 2008 R2。源和目标中的 dtCreated 列都是 DATETIME(非 NULL)。
现在,我了解了错误消息的基本含义,但我无法理解数据或转换如何在包中无效,而在源头上已被视为无效。
奇怪的是,在某些日子包会因为这个错误而失败,重新启动(根据包设置)然后在没有任何人工干预的情况下成功。
关于我应该在可能导致此问题的包步骤中寻找什么的任何指示?数据流任务本身由几个 OLE DB 源组成,每个源都有一个派生列,然后是这些数据集的合并,然后根据 dtCompleted 值有条件地拆分到各种 OLE DB 目标。
【问题讨论】:
-
也许您正试图将您的 SQL 日期时间放入一个过于有限的 SSIS 数据类型,例如 DT_DBTIMESTAMP。您对 dtCreated 使用什么 SSIS 数据类型?看看这是否有帮助:msdn.microsoft.com/en-us/library/ms141036(v=sql.105).aspx
-
嗨,Tab,我正在使用 DT_DBTIMESTAMP,但除非我遗漏了什么,否则我不确定为什么对于 SQL 日期时间来说这太有限了?根据您提供的链接,DT_DBTIMESTAMP 是“由年、月、日、小时、分钟、秒和小数秒组成的时间戳结构。小数秒的固定比例为 3 位。
-
我知道,但文章也这样说:“另一方面,DT_DBTIMESTAMP 由内部具有年、月、日、小时、分钟、秒和毫秒的单独字段的结构表示. 这种数据类型对它可以呈现的日期范围有更大的限制。” “更大的限制”这个短语是......令人困惑,它意味着更多的限制,还是更宽容?乍一看,我以为它的意思是“更有限”,但现在我不太确定了。
-
我认为这意味着,与 DB_DATE(只能保存 1899 年 12 月 30 日的值)相比,DT_DBTIMESTAMP 支持和可存储的日期范围要大得多,因为它具有单独的组件字段。类似于 SQL SMALLDATETIME 可以保存从 1/1/1900 到 6/6/2079 的值,而 DATETIME 的范围可以从 1/1/1753 到 31/12/9999。我已经设置了一些批量插入,然后是逐行插入,以尝试捕获违规行,所以我会看看这是否能说明问题。
-
嗯,这就是我所追求的,无论您使用的 SSIS 数据类型对您的数据来说是否过于有限,但第三个想法,我认为您的解释可能是正确的,并且您使用的限制最少(DT_DBTIMESTAMP2 除外)选项,这应该不是问题。
标签: sql-server sql-server-2008 ssis type-conversion