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

Sql server 从Excel导入SQL Server 2005时出现截断错误,sql-server,excel,import,Sql Server,Excel,Import,长话短说,我将一个接一个地获取大量excel文档,并使用导入/导出向导将它们导入SQLServer2005中的数据库 这里有一个报告(未显示的所有流程都是“成功”)。我有没有办法忽略截断错误?我在谷歌上到处搜索都没有用,或者至少在我的版本中没有 “值-含义描述”列 (234)在输出“Excel源输出”时 (9). 返回的列状态为: “文本被截断或一个或多个 目标中没有匹配的字符 代码页。”。 (SQL Server导入和导出向导) 意思描述“(234)”失败 因为发生了截断,而 “输出”上的截断

长话短说,我将一个接一个地获取大量excel文档,并使用导入/导出向导将它们导入SQLServer2005中的数据库

这里有一个报告(未显示的所有流程都是“成功”)。我有没有办法忽略截断错误?我在谷歌上到处搜索都没有用,或者至少在我的版本中没有

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

意思描述“(234)”失败 因为发生了截断,而 “输出”上的截断行配置 “值-含义描述”列 (234)“指定上的故障 截断。截断误差 在的指定对象上发生 指定的组件。 (SQL Server导入和导出向导)

DTS_E_PrimeOutput失败。这个 基于组件的PrimeOutput方法 “源-表0$”(1)返回错误 代码0xC020902A。组件 当发生故障时返回了故障代码 名为PrimeOutput()的管道引擎。 故障代码的含义如下: 由组件定义,但 错误是致命的,并且管道 停止执行。可能有错误 在此之前发布的消息包含更多 关于失败的信息。 (SQL Server导入和导出向导)

DTS_E_线程失败。线 “SourceThread0”已退出,但出现错误 代码0xC0047038。可能有错误 在此之前发布的消息包含更多 有关线程为何已被删除的信息 退出。 (SQL Server导入和导出向导)

DTS_E_线程已取消。线 “WorkThread0”接收到关机 信号和正在终止。用户 请求关闭,或在中出现错误 另一个线程正在导致管道中断 关闭。可能有错误 在此之前发布的消息包含更多 有关线程被删除原因的信息 取消。 (SQL Server导入和导出向导)

DTS_E_线程失败。线 “WorkThread0”已退出,但出现错误 代码0xC0047039。可能有错误 在此之前发布的消息包含更多 有关线程为何已被删除的信息 退出。 (SQL Server导入和导出向导)

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

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

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


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

无论如何,如果您需要执行向导提供的更多操作,那么您应该直接使用SSIS(SQL Server集成服务)。这就是向导正在使用的,只是它不能假定错误是正常的


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

与SQL Server 2000中的向导相比,该向导使用较小的值作为Excel数据的标准varchar大小。因此,它通常会截断您试图快速导入到上的暂存表的数据。但是,当您执行向导时,一个屏幕将询问您是否要编辑映射,您可以在那里修改字段的大小。或者,您可以先使用create table stament创建一个具有所需大小的工作表(如果您是第一次查看数据并且不知道字段有多大,则nvarchar(max)很好),然后导入到其中。在Excel中,我知道我也遇到了SQl Server的问题,SQl Server只使用几行来确定数据类型,然后插入失败的记录(比如partnumber),因为它认为根据前几条记录,它是一个整数,而实际上它是一个字符串类型的数据。您也可能会遇到这样的问题,因此即使没有出现截断错误,也最好检查映射

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


导入后,我会删除这些垃圾行。

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

什么对我有效

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

打字机行

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

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

注意:对于64位系统,相应的密钥如下所示:

HKLM\SOFTWARE\wow6432node\microsoft\jet\4.0\engines\excel 3.双击TypeGuessRows。 4.在DWORD编辑器对话框中,单击“基数”下的“小数”。为值数据键入一个介于0和16之间(包括0和16)的值。 5.单击“确定”,然后单击“确定”
- Executing (Success)

- Copying to [Datadev].[dbo].[Sheet0$] (Error)
  Messages
  * Error 0xc020901c: Data Flow Task: There was an error with output
  * Error 0xc020902a: Data Flow Task: The "output column "Value
  * Error 0xc0047038: Data Flow Task: SSIS Error Code
  * Error 0xc0047021: Data Flow Task: SSIS Error Code
  * Error 0xc0047039: Data Flow Task: SSIS Error Code
  * Error 0xc0047021: Data Flow Task: SSIS Error Code
- Post-execute (Success)
  Messages
  * Information 0x402090df: Data Flow Task: The final commit for the
  * Information 0x402090e0: Data Flow Task: The final commit for the
- Cleanup (Success)
  Messages
  * Information 0x4004300b: Data Flow Task: "component "Destination -