从Excel导入到SQL Server 2005的截断错误

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

这里有一个报告(所有未显示的过程都是“成功”)。 有没有办法让我忽略截断错误? 我已经search无效,或至less不是在我的版本。

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

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

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

含义描述“(234)”因截断发生而失败,“输出列”上的截断行configuration值含义描述“(234)”指定截断失败。 指定组件的指定对象上发生截断错误。 (SQL Server导入和导出向导)

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

DTS_E_PRIMEOUTPUTFAILED。 组件“Source – Sheet0 $”(1)上的PrimeOutput方法返回了错误代码0xC020902A。 pipe道引擎调用PrimeOutput()时,组件返回失败代码。 失败代码的含义由组件定义,但错误是致命的,并且pipe道停止执行。 在此之前可能会发布错误消息,提供有关失败的更多信息。 (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”收到closures信号并正在终止。 用户请求closures,或者另一个线程中的错误导致pipe道closures。 在此之前可能会发布错误消息,并提供有关为何线程被取消的更多信息。 (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导入和导出向导)

该向导使用较小的值作为Excel数据的标准varchar大小,而不是SQL Server 2000中的向导中获得的大小。因此,它往往会将要尝试快速导入到临时表的数据截断。 但是,当您执行该向导时,一个屏幕会询问您是否要编辑映射,并且可以修复该字段的大小。 或者,您可以先使用create table stament创build一个您想要的大小的工作表(如果您首次查看数据,nvarchar(max)很好,不知道字段有多大),然后导入进去。 使用Excel,我知道我也有SQl服务器使用只有几行来确定数据types,然后插入失败的logging(说partnumber的东西),因为它认为基于前几个logging它是一个整数实际上是一个stringtypes的数据。 你也可能会遇到这样的问题,因此即使你没有得到截断错误,也不妨检查映射。

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

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

这是为我工作的。

这是由于您的registry中的Excel中的一个很好的设置,它告诉它只检查电子表格中的前8行数据,以确定所有数据的剩余部分的列大小。 修复这是修改您的registry将其设置为从8到0.当它设置为0它将检查整个电子表格。 如果文件非常大,这可能会在初始数据导入期间导致一些性能问题。 这是要search的registry项(可能有多个需要设置):

TypeGuessRows

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

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

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\喷气\ 4.0 \发动机\ EXCEL

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

HKLM \ SOFTWARE \ wow6432node \ microsoft \ jet \ 4.0 \ engines \ excel 3.双击TypeGuessRows。 4.在DWORD编辑器对话框中,单击基本下的十进制。 为“数值”数据键入一个介于0和16之间的值(含)。 5.单击确定,然后退出registry编辑器。 解决此问题(无需修改registry)的第二种方法是确保具有数据长度为255个字符或更大的字段的行出现在源数据文件的前8行中。

你为什么要忽略错误? 为什么不find它们并修复它们?

无论如何,如果您需要做的不仅仅是向导提供的function,那么您应该直接使用SSIS(SQL Server Integration Services)。 这就是向导正在使用的,只是它不能认为错误是好的。

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

对于偶尔将Excel,CSV或文本数据导入到SQL Server中出现截断错误的地方,我build议先将数据导入到MS Access中,然后使用大小上的向导直接在SQL中创build和填充表。

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