【问题标题】:Truncation error SQL server 2005 Delete/Insert截断错误 SQL server 2005 删除/插入
【发布时间】:2009-04-02 15:14:13
【问题描述】:

所以我正在尝试使用 SSIS 进行批量插入并不断获取:

“Microsoft SQL Native Client”Hresult:0x80004005 描述:“字符串或二进制数据将被截断。”

即使我已经将每一列的数据转换为与插入行的表完全相同的类型。我使用了一个视图,数据看起来就像它应该在数据库插入步骤之前一样。还是报错。

接下来,我进入 sql server management studio 并在该该死的表中设置了一个插入查询,但仍然得到相同的截断错误。然后我设置了 ANSI_WARNINGS OFF 并且插入的工作数据在表中看起来不错。现在,当我尝试删除这一行时,我得到了截断错误。

除了对这种情况的任何基本输入之外,我的问题是如何关闭 SSIS 中的 ANSI_WARNINGS 以便批量加载可以继续?

【问题讨论】:

  • 那么是否可以在 SSIS 中关闭 ANSI_WARNINGS 而忽略截断?我在插入之前彻底清理了数据,我不相信真的有任何截断。
  • AFAIK,你能做的“最好”是“忽略错误”,但这仍然不会把行放进去。

标签: sql-server ssis bulkinsert truncation


【解决方案1】:

听起来您的列太窄,无法接受您提交的数据。

您能否验证是否是这种情况?

当我们与第三方确定架构时,我经常遇到类似的问题。

您可以选择视图中所有列的 LEN 吗?这可以帮助找到问题。

除此之外,我发现的唯一方法是打印出源数据列实际长度的报告。

【讨论】:

  • +1 提醒我 LEN 是确定哪一列是违规者的好方法 -- 对于任何可能需要它的人,我使用了这个正则表达式 "[([^]]*)] " 并在我的常规选择 1000 查询中替换 "len([\1]) as \1_len" 以查找所有长度
  • 无法正确格式化该评论,因此我似乎无法对其进行编辑,因此请务必在适当的地方添加转义斜杠。
【解决方案2】:

听起来您有一行(可能更多,但只需要一行!)您的数据值超过了表格列的长度。将数据转换为较短的类型会将错误移动到从目标进行转换的任何转换。我建议创建一个平面文件目标,并将转换的错误输出绑定到它。将错误结果更改为“重定向行”。这将允许所有有效行通过,并为您提供被截断的行的副本供您手动处理。

【讨论】:

  • 我设置了重定向行,每一行都因截断错误而失败,并被放入显示哪些行插入失败的平面文件中。
  • 您是否获得了具有有意义值的“错误列”?并非所有组件都提供此功能,因此它通常没有帮助,但如果它在那里,它就是。此外,检查输入和输出的元数据 - 有时没有正确刷新,删除/读取将解决问题。
【解决方案3】:

您要插入的表上是否有触发器?那么错误可能来自触发器执行的操作。

【讨论】:

  • 当我运行 SSIS 或尝试仅执行 1 行的普通 sql 查询插入时,我如何知道触发了 3 个触发器中的哪一个?
  • 我不确定这个小细节是否会出现在错误信息中。我会检查所有三个,但是,我不是专家级 SQL 开发人员。
【解决方案4】:

事实证明,在 SSIS 中,您可以使用“数据访问模式 > 表或视图:快速模式”设置 OLE DB 目标。当我选择此设置时,批量插入没有任何警告或错误,并且数据库中的数据看起来很完美。不确定此更改究竟做了什么,但它起作用了,在一个 SSIS 插入 16 小时后,我对结果感到满意。

感谢您的建议。

【讨论】:

  • 该模式很可能会关闭您的触发器。如果你不需要它们,你很好。请咨询您的 DBA,因为他们可能是必要的(因为他们在我正在从事的项目中)。
  • 大声笑我是 DBA,它是一家较小的商店,我正在尽我所能。我或多或少只是管理和填充我们的数据库。这家公司实际上根本没有任何 DBA。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多