sql导入excel表格的问题 求高手解答 本帖最后由 zearling1 于 2013-01-29 17:50:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果你给入的变量@strExcelPath@strExcelSheetName@strWhere有错误,select没有执行,那么就会出现这个错误。点击数据库右键,任务,数据导入就能倒入excel了,不用这么麻烦。但是最好在导入的时候把excel存成csv文件导入,不然时间列经常会被转成int存储。 我是要写在程序里的方法不然我也不用那么麻烦 直接sql导了 那你就看看@strExcelPath@strExcelSheetName@strWhere是不是都正确,还有就是 Extended properties=Excel 5.0是否正确,我google了一下,通常都是使用8.0就像我之前说的,SET @strSql = 'SELECT ' + @strExcelFiled + ' INTO ##Temp FROM OpenDataSource('+ @strExcelPath +')'+ @strExcelSheetName +'$ '+@strWhere --PRINT(@strSql) EXEC(@strSql)这里你print一下strsql 看看能不能执行,应该是没有数据读取,所以后面就出错了。 期待答案,能否测试成功之后告诉一下我通过的代码啊?我都好需要这样的存储过程,现在都是用C#的DATAGIRDVIEW控件导入到电子表格来导出数据,但电子表格导入该控件我还不太懂,最希望用存储过程来导入实际表内之后显示出来 USE [bcsr]GO/****** Object: StoredProcedure [dbo].[spExcelOutIn] Script Date: 01/30/2013 15:30:52 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO/*--下面两句在创建存储过程时必须先执行,否则不能创建本存储过程,或者调用出错SET ANSI_WARNINGS ON--返回警告GOSET ANSI_NULLS ON-- 指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 SQL-92 遵从行为。GO--将Excel数据导入到sql数据库--版权 : 启程 letwego.cn--调用实例EXEC spExcelOutIn @strOptions = 'In',@strWhere = 'WHERE 房号>0',--导入/导出查询条件(包括Where 关键字)@strExcelPath = 'd:\test.xls',--Excel的绝对路径@strExcelSheetName = 'Sheet2',--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$@strExcelFiled = '单元编号,单元名称,房号,建筑面积,楼层,楼层名称,楼阁编号,业主',--Excel工作表的字段@strSqlTableName = 'TExcelOutIn',--Sql数据库导入表名@strSqlFiled = '单元编号,单元名称,房号编号,建筑面积,楼层,楼层名称,楼阁编号,业主编号'--Sql表的字段*/ALTER PROCEDURE [dbo].[spExcelOutIn]@strOptions varchar(200) = NULL,@strWhere nvarchar(4000) = NULL,--导入/导出查询条件(包括Where 关键字)@strExcelPath nvarchar(1000) = NULL,--Excel的绝对路径@strExcelSheetName nvarchar(50) = NULL,--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$@strExcelFiled nvarchar(1000) = NULL,--Excel工作表的字段@strSqlTableName nvarchar(100) = NULL,--Sql数据库导入/导出表名@strSqlFiled nvarchar(1000) = NULL--Sql表的字段ASDECLARE @strSql nvarchar(4000)DECLARE @count intIF OBJECT_ID('tempdb..##Temp') IS NOT NULL DROP TABLE ##Temp/* 导入 */IF @strOptions='In' AND NOT @strExcelPath IS NULL BEGINSET @strExcelPath = '''Microsoft.Jet.OLEDB.4.0'',''Data Source="' + @strExcelPath + '";User ID=Admin;Password=;Extended properties=Excel 8.0'''--将数据存放到临时表(一)SET @strSql ='SELECT ' + @strExcelFiled +' INTO ##TempFROM OpenDataSource('+ @strExcelPath +')...'+ @strExcelSheetName +'$ '+@strWhere--PRINT(@strSql)EXEC(@strSql)--将数据从临时表导入到sql数据库表(二,分两步可以做更多的处理)SET @strSql = 'INSERT INTO ' + @strSqlTableName + '('+ @strSqlFiled +') SELECT * FROM ##Temp'PRINT(@strSql)EXEC(@strSql)--SELECT * FROM ##TempDROP TABLE ##TempEND/* 导出 */IF @strOptions='Out' AND NOT @strExcelPath IS NULL BEGINSET @strExcelPath = ''--导成类似(不是真正的Excel,是文本格式)Excel的文件,这里是固定的,真正用时需要修改相关参数--EXEC master..xp_cmdshell 'bcp "SELECT * FROM wy_福州分公司.dbo.TExcelOutIn" queryout C:\test.xls -c -S"(local)" -U"sa" -P"123"'ENDdeclare @batchname intSET @batchname=(select MAX(id) from riskbatch)IF @strSqlTableName = 'accountinfo'BEGIN SET @count=(SELECT COUNT(*) FROM accountinfo WHERE batchname is null) UPDATE riskbatch SET count=@count WHERE id=@batchname update accountinfo set batchname=@batchname where batchname is nullENDIF @strSqlTableName = 'tb_transaction' update tb_transaction set batchname=@batchname where batchname is null这个是通用的方法 然后我当时查询的时候通过这种EXEC spExcelOutIn @strOptions = 'In',@strWhere = '',--导入/导出查询条件(包括Where 关键字)@strExcelPath = 'd:/CN20130110181706-testing.xls',--Excel的绝对路径@strExcelSheetName = '渣打银行',--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$@strExcelFiled ='"ACCOUNTNODeal No","Customer Chinese Name","Customer English Name","Currency","Balance","Bizcode","Email","Normal","Balance Date","RELATIONSHIPNO","Master No","Account Opening Branch Chinese Name","Branch Code","ARM Code","Product Code","Product Description","Segment Code","EMT","Account Status","Account Open Date"',--Excel工作表的字段@strSqlTableName = 'accountinfo',--Sql数据库导入表名@strSqlFiled = 'accountno,chinesename,englishname,currency,balance,bizcode,isemail,isnormal,balancedate,relationshipno,masterno,accountopenbranch,branchcode,armcode,productcode,productdesc,segmentcode,emt,accountstatus,accountOpenDate'--Sql表的字段搞定了 总结excel中第一行的对应的sql表的列名 但是 他的格式中不能有符号 且如果有控制之类的要用""转义符来转义 初学数据库,遇到一道关于数据库sql语句的题目,实在不会,请高手解惑! 关于数据库 怎么修改主键 SQL语句 还是sql语句。。。。。 關於存儲過程的問題 关于sql2005中的维护计划运行失败 如何用sql启动sql 代理? 求教:如何写这条select语句 如果连接另外一台机器上的数据库? win7旗舰版下安装SQL2005开发版安装问题 关于sql 循环求和问题
@strExcelPath
@strExcelSheetName
@strWhere
有错误,select没有执行,那么就会出现这个错误。点击数据库右键,任务,数据导入就能倒入excel了,不用这么麻烦。
但是最好在导入的时候把excel存成csv文件导入,不然时间列经常会被转成int存储。
@strExcelPath
@strExcelSheetName
@strWhere
是不是都正确,还有就是 Extended properties=Excel 5.0是否正确,我google了一下,通常都是使用8.0就像我之前说的,
SET @strSql = 'SELECT ' + @strExcelFiled + ' INTO ##Temp FROM OpenDataSource('+ @strExcelPath +')'+ @strExcelSheetName +'$ '+@strWhere
--PRINT(@strSql)
EXEC(@strSql)
这里你print一下strsql 看看能不能执行,应该是没有数据读取,所以后面就出错了。
GO
/****** Object: StoredProcedure [dbo].[spExcelOutIn] Script Date: 01/30/2013 15:30:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
--下面两句在创建存储过程时必须先执行,否则不能创建本存储过程,或者调用出错
SET ANSI_WARNINGS ON--返回警告
GO
SET ANSI_NULLS ON-- 指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 SQL-92 遵从行为。
GO
--将Excel数据导入到sql数据库
--版权 : 启程 letwego.cn
--调用实例
EXEC spExcelOutIn
@strOptions = 'In',
@strWhere = 'WHERE 房号>0',--导入/导出查询条件(包括Where 关键字)
@strExcelPath = 'd:\test.xls',--Excel的绝对路径
@strExcelSheetName = 'Sheet2',--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$
@strExcelFiled = '单元编号,单元名称,房号,建筑面积,楼层,楼层名称,楼阁编号,业主',--Excel工作表的字段@strSqlTableName = 'TExcelOutIn',--Sql数据库导入表名
@strSqlFiled = '单元编号,单元名称,房号编号,建筑面积,楼层,楼层名称,楼阁编号,业主编号'--Sql表的字段
*/
ALTER PROCEDURE [dbo].[spExcelOutIn]@strOptions varchar(200) = NULL,
@strWhere nvarchar(4000) = NULL,--导入/导出查询条件(包括Where 关键字)@strExcelPath nvarchar(1000) = NULL,--Excel的绝对路径
@strExcelSheetName nvarchar(50) = NULL,--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$
@strExcelFiled nvarchar(1000) = NULL,--Excel工作表的字段@strSqlTableName nvarchar(100) = NULL,--Sql数据库导入/导出表名
@strSqlFiled nvarchar(1000) = NULL--Sql表的字段ASDECLARE @strSql nvarchar(4000)
DECLARE @count int
IF OBJECT_ID('tempdb..##Temp') IS NOT NULL DROP TABLE ##Temp
/* 导入 */
IF @strOptions='In' AND NOT @strExcelPath IS NULL BEGINSET @strExcelPath = '''Microsoft.Jet.OLEDB.4.0'',''Data Source="' + @strExcelPath + '";User ID=Admin;Password=;Extended properties=Excel 8.0'''--将数据存放到临时表(一)
SET @strSql =
'SELECT ' + @strExcelFiled +
' INTO ##Temp
FROM
OpenDataSource('+ @strExcelPath +')...'+ @strExcelSheetName +'$ '
+@strWhere--PRINT(@strSql)
EXEC(@strSql)--将数据从临时表导入到sql数据库表(二,分两步可以做更多的处理)
SET @strSql = 'INSERT INTO ' + @strSqlTableName + '('+ @strSqlFiled +') SELECT * FROM ##Temp'
PRINT(@strSql)
EXEC(@strSql)--SELECT * FROM ##Temp
DROP TABLE ##TempEND/* 导出 */
IF @strOptions='Out' AND NOT @strExcelPath IS NULL BEGINSET @strExcelPath = ''
--导成类似(不是真正的Excel,是文本格式)Excel的文件,这里是固定的,真正用时需要修改相关参数
--EXEC master..xp_cmdshell 'bcp "SELECT * FROM wy_福州分公司.dbo.TExcelOutIn" queryout C:\test.xls -c -S"(local)" -U"sa" -P"123"'
END
declare @batchname intSET @batchname=(select MAX(id) from riskbatch)IF @strSqlTableName = 'accountinfo'
BEGIN
SET @count=(SELECT COUNT(*) FROM accountinfo WHERE batchname is null)
UPDATE riskbatch SET count=@count WHERE id=@batchname
update accountinfo set batchname=@batchname where batchname is null
END
IF @strSqlTableName = 'tb_transaction'
update tb_transaction set batchname=@batchname where batchname is null这个是通用的方法 然后我当时查询的时候通过这种EXEC spExcelOutIn
@strOptions = 'In',
@strWhere = '',--导入/导出查询条件(包括Where 关键字)
@strExcelPath = 'd:/CN20130110181706-testing.xls',--Excel的绝对路径
@strExcelSheetName = '渣打银行',--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$
@strExcelFiled ='"ACCOUNTNODeal No","Customer Chinese Name","Customer English Name","Currency","Balance","Bizcode","Email","Normal","Balance Date","RELATIONSHIPNO","Master No","Account Opening Branch Chinese Name","Branch Code","ARM Code","Product Code","Product Description","Segment Code","EMT","Account Status","Account Open Date"',--Excel工作表的字段@strSqlTableName = 'accountinfo',--Sql数据库导入表名
@strSqlFiled = 'accountno,chinesename,englishname,currency,balance,bizcode,isemail,isnormal,balancedate,relationshipno,masterno,accountopenbranch,branchcode,armcode,productcode,productdesc,segmentcode,emt,accountstatus,accountOpenDate'--Sql表的字段搞定了 总结excel中第一行的对应的sql表的列名 但是 他的格式中不能有符号 且如果有控制之类的要用""转义符来转义