前几天考试系统导入导出学生信息,初次接触导入导出,为sqlserver和excel的数据传递方法之简和MS产品的高效兼容所震惊,但也遇到各种各样问题,在此介绍SQLServer导入导出excel方法及遇到的问题。
SQLServer导出Excel
导出步骤想对较少,出现的问题也较少。
1、进入Excel---数据---自其它来源---来自SQLServer。如图:
:
2、连接数据库:
3、选择数据库和表---完成:
4、选择插入位置---确定---显示导出结果:
SQLServer导入excel
1、选择要导入的数据库---任务---导入数据,如图:
2、选择excel数据源---浏览文件。注意如果excel中首行数据为字段,应勾选“首行包含列名称”。
3、选择数据库---选择源表和原视图:
注意,如果不选则目标,则会在数据库中自动生成同名的表,并把数据导入进去。
4、如不需保存SSIS包,直接点击完成即可。
不出错误到此以导入完毕,但是实际上并非如此,错误示例:
操作已停止...- 正在初始化数据流任务 (成功)- 正在初始化连接 (成功)- 正在设置 SQL 命令 (成功)- 正在设置源连接 (成功)- 正在设置目标连接 (成功)- 正在验证 (成功)- 准备执行 (成功)- 执行之前 (成功)- 正在执行 (成功)- 正在复制到 [dbo].[t_Student] (错误)消息错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS_E_OLEDBERROR。出现 OLE DB 错误。错误代码: 0x80004005。已获得 OLE DB 记录。源:“Microsoft SQL Server Native Client 10.0” Hresult: 0x80004005 说明:“未指定的错误”。 (SQL Server 导入和导出向导) 错误 0xc020901c: 数据流任务 1: 输入“Destination Input”(60) 上的 输入列“studentId”(127) 出错。返回的列状态是:“该值违反了该列的完整性约束。”。 (SQL Server 导入和导出向导) 错误 0xc0209029: 数据流任务 1: SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。“输入“Destination Input”(60)”失败,错误代码为 0xC020907D,而且针对“输入“Destination Input”(60)”的错误行处理设置指定一旦出错就失败。在指定组件的指定对象上出错。可能在此之前已经发出错误消息,提供了有关失败的详细信息。 (SQL Server 导入和导出向导) 错误 0xc0047022: 数据流任务 1: SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。处理输入“Destination Input”(60)时,组件“目标 - t_Student”(47)的 ProcessInput 方法失败,错误代码为 0xC0209029。标识的这个组件从 ProcessInput 方法返回了一个错误。虽然该错误是此组件特有的,但却是致命的,将导致数据流任务停止运行。可能在此之前已经发出错误消息,提供了有关失败的详细信息。 (SQL Server 导入和导出向导) - 执行之后 (成功)消息信息 0x402090df: 数据流任务 1: “组件“目标 - t_Student”(47)”中的数据插入操作的最终提交已开始。 (SQL Server 导入和导出向导) 信息 0x402090e0: 数据流任务 1: “组件“目标 - t_Student”(47)”中的数据插入操作的最终提交已结束。 (SQL Server 导入和导出向导) 信息 0x4004300b: 数据流任务 1: “组件“目标 - t_Student”(47)”已写入 0 行。 (SQL Server 导入和导出向导)就个人经验而言,一般提示最有用能直观展示非系统问题的是第二个错误提示,如上述:“错误 0xc020901c: 数据流任务 1: 输入“Destination Input”(60) 上的 输入列“studentId”(127) 出错。返回的列状态是:“该值违反了该列的完整性约束。”
常见问题:
1、外键约束,例如:已获得 OLE DB 记录。源:“Microsoft SQL Server Native Client 10.0” Hresult: 0x80004005 说明:“INSERT 语句与 FOREIGN KEY 约束"FK_t_Student_t_Classes"冲突。该冲突发生于数据库"CollegeSystemVBTest",表"dbo.t_Classes", column 'classId'。”一般外键约束禁止更新或插入会触发此问题,解决方法,详见我的博客《简简单单说外键和级联》。
2、列的完整性约束,例如:“错误 0xc020901c: 数据流任务 1: 输入“Destination Input”(60) 上的 输入列“studentId”(127) 出错。返回的列状态是:“该值违反了该列的完整性约束。”一般主键约束会触发此问题,例如导入的excel中主键重复。想想当时因为是由2000多行学生信息,转专业的学生、源数据错误都会产生重复行,当时想的办法是先导入Access,查找重复列然后再删除,虽能解决,但是效率太低,更好的解决方法,excel自带去除重复列功能,进入excel---数据---删除重复项。
3、映射列多余,SQLserver虽然可以智能识别映射列,但是成功率并非100%,所以可以在导入excel第三步骤中编辑映射列或是选择生成映射列。
4、数据长度,这个问题也十分常见,excel单元格默认字符长度最大值为255,超过255即出错。
文尾
一般情况下,虽然有时候错误不是那么好理解和找到,但是只要认真观察,即可发现错误,否则即使小小的一个错误,也能耗上你半天。反思:仔细观察每个提示、有针对性的解决、多角度尝试、不要想着只要解决问题,同时要学习解决问题的这个过程。