从 Excel 导入 SQL Server 2005 时出现截断错误

Posted

技术标签:

【中文标题】从 Excel 导入 SQL Server 2005 时出现截断错误【英文标题】:Truncation errors importing to SQL Server 2005 from Excel 【发布时间】:2010-11-05 13:54:31 【问题描述】:

长话短说,我正在一个一个地获取一堆 Excel 文档,并使用导入/导出向导将它们导入 SQL Server 2005 中的数据库。

这是一份报告(所有未显示的过程均为“成功”)。我有什么办法可以忽略截断错误?我用谷歌搜索无济于事,或者至少在我的版本中没有。

- Executing (Success)

- Copying to [Datadev].[dbo].[Sheet0$] (Error)
  Messages
  * Error 0xc020901c: Data Flow Task: There was an error with output

列“值含义描述” (234) 输出“Excel 源输出” (9)。返回的列状态为: “文本被截断或一个或多个 字符在目标中没有匹配 代码页。”。 (SQL Server 导入导出向导)

  * Error 0xc020902a: Data Flow Task: The "output column "Value

含义描述“(234)”失败 因为发生了截断,并且 “输出”上的截断行处置 “值含义说明”列 (234)" 指定失败 截断。截断错误 发生在指定对象上 指定的组件。 (SQL Server 导入导出向导)

  * Error 0xc0047038: Data Flow Task: SSIS Error Code

DTS_E_PRIMEOUTPUTFAILED。这 组件上的 PrimeOutput 方法 “来源 - Sheet0$” (1) 返回错误 代码 0xC020902A。组件 返回失败代码时 管道引擎称为 PrimeOutput()。 故障码的含义是 由组件定义,但 错误是致命的,管道 停止执行。可能有错误 在此之前发布的消息更多 有关故障的信息。 (SQL Server 导入导出向导)

  * Error 0xc0047021: Data Flow Task: SSIS Error Code

DTS_E_THREADFAILED。线 “SourceThread0”已退出并出现错误 代码 0xC0047038。可能有错误 在此之前发布的消息更多 关于为什么线程有的信息 退出。 (SQL Server 导入导出向导)

  * Error 0xc0047039: Data Flow Task: SSIS Error Code

DTS_E_THREADCANCELLED。线 “WorkThread0”收到关闭 信号并且正在终止。用户 请求关闭,或出现错误 另一个线程导致管道 去关机。可能有错误 在此之前发布的消息更多 关于为什么线程的信息 取消。 (SQL Server 导入导出向导)

  * Error 0xc0047021: Data Flow Task: SSIS Error Code

DTS_E_THREADFAILED。线 “WorkThread0”已退出并出现错误 代码 0xC0047039。可能有错误 在此之前发布的消息更多 关于为什么线程有的信息 退出。 (SQL Server 导入导出向导)

- Post-execute (Success)
  Messages
  * Information 0x402090df: Data Flow Task: The final commit for the

数据插入已开始。 (SQL Server 导入导出向导)

  * Information 0x402090e0: Data Flow Task: The final commit for the

数据插入已结束。 (SQL Server 导入导出向导)

- Cleanup (Success)
  Messages
  * Information 0x4004300b: Data Flow Task: "component "Destination -

Sheet0$" (323)" 写了 210 行。 (SQL Server 导入导出向导)

【问题讨论】:

【参考方案1】:

当我收到截断错误时,我会插入 8 个虚拟行。每个单元格都有长度 > 256 的垃圾文本。这会强制检测到的数据类型为 varchar(max) 而不是 varchar(256)。如果一行是数字列,我必须用数字填充它(例如,0),如果它是一个日期,我必须填写一个虚拟日期,否则这些列将使用空数据导入。

然后我在导入后删除这些垃圾行。

【讨论】:

为我做到了,简单高效。不过,一个虚拟行就足够了。 就我而言,以这种方式编辑第一行而不是 8 行就足够了。 这是最好的响应,即使是 SQL Server 2012+ 最佳解决方案。它还给出了它为什么起作用的合乎逻辑的解释!【参考方案2】:

该向导使用比您在 SQL Server 2000 中的向导中获得的更小的值作为 Excel 数据的标准 varchar 大小。因此,它经常截断您尝试快速导入临时表的数据。但是,当您执行向导时,会出现一个屏幕询问您是否要编辑映射,您可以在那里修复字段的大小。或者您可以先使用创建表语句来创建具有所需大小的工作表(如果您是第一次查看数据并且不知道字段有多大,则 nvarchar(max) 很好)然后导入进去。使用 Excel,我知道我也遇到了 SQl Server 的问题,它只使用几行来确定数据类型,然后插入记录失败(比如零件号之类的东西),因为它认为基于前几条记录它是一个整数实际上是一种字符串类型的数据。您也可能遇到这样的问题,因此即使您没有收到截断错误,也最好检查映射。

【讨论】:

我不断收到截断错误,其中包含最大长度为 10 个字符的值的字段。即使我将字段的截断错误设置为忽略,我也会不断收到错误消息。这是一个已知问题吗?【参考方案3】:

Here's 对我有用。

这是由于注册表中 Excel 中的一项出色设置告诉它仅检查电子表格中的前 8 行数据以确定所有数据其余部分的列大小。解决此问题的方法是修改您的注册表,将其从 8 设置为 0。当它设置为 0 时,它将检查整个电子表格。如果文件非常大,这可能会在初始数据导入期间导致一些性能问题。这是要搜索的注册表项(可能需要设置多个):

TypeGuessRows

【讨论】:

这就解释了。无需插入虚拟行,因为无论如何您都需要稍后删除这些虚拟行。相反,在您的 excel 文件中创建一个额外的列,在失败的列上执行字符计数 "=LEN(Cell#),然后按 DESCENDING 对该列进行排序。这样,单元格中的大多数字符将位于顶行,导入 .... 希望对您有所帮助。【参考方案4】:

http://support.microsoft.com/kb/281517

要更改 TypeGuessRows 的值,请使用以下步骤: 1.在开始菜单上,单击运行。在运行对话框中,键入 Regedt32,然后单击确定。 2.在注册表编辑器中打开以下键:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

注意对于64位系统,对应的key如下:

HKLM\SOFTWARE\wow6432node\microsoft\jet\4.0\engines\excel 3.双击TypeGuessRows。 4. 在 DWORD 编辑器对话框中,单击 Base 下的 Decimal。为数值数据键入一个介于 0 和 16 之间的值(包括 0 和 16)。 5.单击确定,然后退出注册表编辑器。 解决此问题的第二种方法(不修改注册表)是确保在源数据文件的前 8 行中存在具有 255 个字符或更大数据的字段的行。

【讨论】:

在哪台电脑上?执行器或 sql 安装在哪里?【参考方案5】:

为什么要忽略错误?为什么不找到它们并修复它们?

无论如何,如果您需要做的工作超出了向导提供的范围,那么您应该直接使用 SSIS(SQL Server 集成服务)。这就是向导正在使用的,只是它不能假设错误是可以的。

编写一个 SSIS 包来循环您的 Excel 文件并一次导入一个非常简单。导入数据流可以配置为忽略错误,或对错误执行其他操作,例如报告错误。

【讨论】:

这是我正在做的一项小任务,总共有数千列。手动修复每个都有些不合逻辑(在我的情况下)。感谢您提供 SSIS 信息。 它的逻辑性取决于问题发生的频率和原因。例如,如果您仔细查看这些错误消息,您会发现这是截断 不正确的代码页。前者可能只是使用更宽的列;后者可能是几个非ASCII字符的问题。【参考方案6】:

对于偶尔将 Excel、CSV 或文本数据导入 SQL Server 并遇到截断错误的情况,我建议先将数据导入 MS Access,然后使用大小调整向导直接在 SQL 中创建和填充表.

【讨论】:

【参考方案7】:

在 SQL Server 导入向导中,一旦您进入需要指定用于导入数据的文件的部分,请单击“高级”选项。这将向您显示输入文件中的所有字段以及字段属性。您需要更改的属性是“DataType”。它通常默认为“string[DT_STR]”。如果您将其更改为“文本流[DT_TEXT]”,您将大大增加字段的大小,因此很可能会避免截断错误。

【讨论】:

以上是关于从 Excel 导入 SQL Server 2005 时出现截断错误的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar

从 excel 导入数据时防止 SQL Server 2008 中的行重复

从 Excel 导入 SQL Server 2005 时出现截断错误

Kettle从excel导入数据到sql server

使用导入导出向导将数据从 Excel 导入 Sql Server 时,如何更改列的默认 varchar 255?

从 Azure Excel blob 文件将数据导入 SQL Server