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

时间:2009-06-24 16:15:26

标签: sql-server excel import

简而言之,我将逐一获取一堆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方法   “Source - 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导入和导出向导)

7 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:5)

Here's什么对我有用。

  

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

     

TypeGuessRows

答案 3 :(得分:4)

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

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

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\喷气\ 4.0 \发动机\ Excel中

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

HKLM \ SOFTWARE \ wow6432node \微软\喷射\ 4.0 \发动机\ EXCEL 3.双击TypeGuessRows。 4.在“DWORD编辑器”对话框中,单击“基数”下的“十进制”。为值数据键入0到16之间的值(包括0和16)。 5.单击“确定”,然后退出注册表编辑器。 解决此问题的第二种方法(不修改注册表)是确保源数据文件的前8行中包含具有255个字符或更大数据的字段的行。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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