【问题标题】:SSIS - the value cannot be converted because of a potential loss of dataSSIS - 由于潜在的数据丢失,无法转换该值
【发布时间】:2012-07-29 08:38:57
【问题描述】:

我对 SSIS 比较陌生。我正在尝试使用 Microsoft OLEDB for Oracle 从 Oracle 数据库中提取信息,我正在使用以下查询:

SELECT ID FROM Test

我收到一条错误消息:the value cannot be converted because of a potential loss of data。如果我将查询更改为以下内容,则它可以工作:

SELECT '1' FROM Test

我认为它失败了,因为 ID 不是整数。但是,平面文件连接管理器显示 OutputColumnWidth 为 50。我做错了什么?

格林威治标准时间 16:30 更新
我对此进行了更多研究,似乎是具有“频率”或“无”直方图的列导致了问题。那些具有“高度平衡”直方图的人似乎没问题。

【问题讨论】:

  • Test表中ID的数据类型是什么?
  • @blinkc,它似乎是:String[DT_STR]
  • @billinkc,我已经编辑了这个问题。请看一看。
  • 我的经验表明,由于数据类型不匹配和截断的可能性,它正在抱怨(正如您正确地认为的那样)。我相信无论如何你都可以强制它进行转换,我认为它只是安全的,你必须在你的 SSIS 包中添加一些错误处理。见msdn.microsoft.com/en-us/library/ms141706.aspx
  • @PaulSullivan,您能否解释一下我如何“强制它进行转换”。谢谢。

标签: sql-server oracle ssis etl


【解决方案1】:

这是一件很平常的事。在很多情况下,从无法确定列元数据的另一种类型的系统导入 ssis 时,默认情况下默认为 str(50)。由于您试图将其推入一个字符列,因此假设您可能会丢失数据。只需右键单击并选择“显示高级编辑器...”即可进入源组件

然后导航到最后一个选项卡(输入和输出属性)

单击 OLE DB 源输出旁边的 +

单击“输出列”旁边的 +

突出显示 ID 列

滚动到对话框右侧的长度数据类型属性并将其从 50 更改为 1。

【讨论】:

  • 感谢您的 +1。解决方案是与您所说的完全相反,即将 1 更改为 50(您指出我的方向正确)。我假设您说将 50 更改为 1 是因为您认为它是整数类型? - 它实际上是一个字符串类型。我注意到一些输出列的数据类型错误,例如String 的四字节有符号整数。在我接受您的回答之前,您能解释一下为什么会发生这种情况吗?
  • 我认为它是 1,因为您说它适用于 '1' 我最初认为错误出现在您将导入的数据移动到较小的目标字段的下一步中。您在此处的描述表明元数据在实际导入时出错。您是否使用与 Oracle DB 处于同一级别的 Oracle 驱动程序? AlwaysUseDefaultCodePage 标志的状态是什么(请参阅我的答案:stackoverflow.com/a/8697899/236348)?
  • 谢谢。在写问题之前,我已经根据您的链接设置了 AlwaysUseDefaultCodePage 标志。 “元数据错误”和“在同一级别”是什么意思?
  • 谢谢。你能在这里回答我的另一个问题吗? stackoverflow.com/questions/11765026/…
  • 也为我工作。确保您可以进入输出列并确保您的数据类型不乱。我不得不将那些试图作为双精度浮点数通过的那些更改为 Unicode (255),这对我有帮助。
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 2012-11-07
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多