我之前看过这种类型的错误(例如截断),但是没有使用datetime字段。
在源上有一个似乎失败的数据流任务。 OLEDB数据源是对过程的调用,结果集的列之间是日期时间字段GAPPOSTDT。返回值是一个日期时间,程序返回正常,具有预期的结果。当我通过数据流任务运行时不是这样。查看oledb源的高级属性,我看到此字段的类型设置为数据库时间戳[DT_DBTIMESTAMP],这似乎是正确的。
可能导致此字段无法映射的原因是什么?
我尝试过删除数据流任务并重新创建它。同样的问题。
请参阅下面的错误消息。
错误:0xC020901C在数据流任务,OLE DB源[1]:有一个 输出列错误" GAPOSTDT" (61)关于输出" OLE DB源 输出" (11)。返回的列状态为:"值不可能 由于可能丢失数据而转换。"。错误:0xC0209029 at 数据流任务,OLE DB源[1]:SSIS错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 "输出列" GAPOSTDT" (61)"失败,因为发生错误代码0xC0209072,错误行 处理"输出栏" GAPOSTDT" (61)"指定失败 错误。指定的指定对象发生错误 零件。在此之前可能会发布错误消息 有关失败的信息。
[更新#1]
SSIS 2008
所以我将过程输出改为return varchar(10)而不是datetime。数据流中的OLEDB源现在出现以下错误
错误:数据流任务中的0xC020901C,OLE DB源[1]:输出列出现错误" GAPOSTDT" (61)关于输出" OLE DB源输出" (11)。返回的列状态为:"文本被截断或目标代码页中的一个或多个字符不匹配。"。 错误:数据流任务中的0xC020902A,OLE DB源[1]:"输出列" GAPOSTDT" (61)"失败,因为发生了截断,截断行处理"输出列" GAPOSTDT" (61)"指定截断失败。指定组件的指定对象发生截断错误。
我现在怀疑一些"傻瓜"数据中的字符。源系统中使用的排序规则是SQL_Latin1_General_CP1_CI_AS
[更新#2]
好的,我想我可能已经找到了这个问题。在我的程序中,我有一个"虚拟"结果,因为我的程序使用临时表,这是一个"解决"与SSIS(见其他主题)。我的最终结果和虚拟结果的列的顺序错误。所以这会将数据放入错误的列中。当我戴上数据查看器时,我注意到了这一点。弹出后,我发现数据进入了错误的列。奇怪我想,然后在审查我的程序后,我找到了罪魁祸首。
答案 0 :(得分:1)
日期时间字段总是存在问题......;)
尝试将此字段转换为源上查询中的字符串,然后应用派生列转换所需的更改。在我居住的地方,我们使用日期格式dd.mm.yyyy,但我至少得到了3种不同的日期格式......
也许这不是最好的答案,但值得尝试......它很适合我...... :)
答案 1 :(得分:0)
这是因为输入列的数据类型与目标列不匹配。你提到你在var var列之前已经看过,那是因为该列的输入记录的大小(数据长度)小于目的地,如果输入是varchar(30),destination是varchar(20),那会导致这个问题。检查您的数据类型,我猜您在尝试使用datetime
和datetime2
或datetimeoffset
例如:
input varchar(30) destination varchar(30) perfectly match
input varchar(20) destination varchar(30) fine but a warning
input varchar(30) destination varchar(20) if actual is smaller than 20, that is fine, but if bigger than 20, cause error