设为首页 收藏本站
查看: 718|回复: 0

[经验分享] 执行SQL存储过程/SQL与excel互导

[复制链接]

尚未签到

发表于 2016-11-10 06:46:04 | 显示全部楼层 |阅读模式
  昨天。。。客户要求,说要把数据库里的数据导出到excel,没办法,以前没做过这个,只好去网上查资料
  几经周折,终于找到了方法,不过是利用sql的存储过程来实现的。。。。。
  以下是原文:
来自:http://www.cnblogs.com/bonny.wong/archive/2005/01/29/99387.html
  **************************************************************************************************************
  最近看到很多朋友在论坛上问SQL Server表与Excel、Access数据互导的问题,问题很简单,也很早就有人专门写文章讨论过这个问题,但看了那些文章,也没几个人讲得很明白,都是些很笼统的格式,估计初学者会被那些答案弄得稀里糊涂,更别说能学到新的东西。

        基于这个原因,下面我将详细的讲解互导的过程,当然,常规的在SQL Server管理器中得用向导互导的过程我就不多讲了,下面讲的都是直接用T-SQL语句来实现的。

        1、SQL Server导出为Excel:
        要用T-SQL语句直接导出至Excel工作薄,就不得不用借用SQL Server管理器的一个扩展存储过程:xp_cmdshell,此过程的作用为“以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。”下面为定义示例:

EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Book3.xls -c -q -S"servername" -U"sa" -P""'

--参数:S 是SQL服务器名;U是用户名;P是密码,没有就空着

--说明:其实用这个过程导出的格式实质上就是文本格式的,不信的话在导出的Excel表中改动一下再保存看看。

  
    实际例子与说明如下:

/**//*如果要将表整个导出至Excel的话*/
EXEC master..xp_cmdshell 'bcp northwind.dbo.orders out c:\Book1.xls -c -q -S"(local)" -U"sa" -P""'

--注意句中的northwind.dbo.orders,为数据库名+拥有者+表名

--直接导出用“out”关健字

-------------------------------------------
/**//*如果要利用查询来导出部分字段至Excel的话*/
EXEC master..xp_cmdshell 'bcp "SELECT orderid,cutomerid,freight FROM northwind..orders ORDER BY orderid" queryout C:\ Book2.xls -c -S"(local)" -U"sa" -P""'

--这里在bcp后面加了一个查询语句,并用双引号括起来

--利用查询要用“queryout”关键字

  
        2、Excel导入SQL Server表:
        在SQL Server中,有定义一个OpenDateSource函数,用于引用那些不经常访问的 OLE DB 数据源,而我们的数据互导操作,就是建立在这个函数之上。
         
        首先看一个T-SQL帮助中的示例,描述如下:

  
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Book3.xls -c -q -S"servername" -U"sa" -P""'

--参数:S 是SQL服务器名;U是用户名;P是密码,没有就空着

--说明:其实用这个过程导出的格式实质上就是文本格式的,不信的话在导出的Excel表中改动一下再保存看看。

  
    实际例子与说明如下:

/**//*如果要将表整个导出至Excel的话*/
EXEC master..xp_cmdshell 'bcp northwind.dbo.orders out c:\Book1.xls -c -q -S"(local)" -U"sa" -P""'

--注意句中的northwind.dbo.orders,为数据库名+拥有者+表名

--直接导出用“out”关健字

-------------------------------------------
/**//*如果要利用查询来导出部分字段至Excel的话*/
EXEC master..xp_cmdshell 'bcp "SELECT orderid,cutomerid,freight FROM northwind..orders ORDER BY orderid" queryout C:\ Book2.xls -c -S"(local)" -U"sa" -P""'

--这里在bcp后面加了一个查询语句,并用双引号括起来

--利用查询要用“queryout”关键字

  
        2、Excel导入SQL Server表:
        在SQL Server中,有定义一个OpenDateSource函数,用于引用那些不经常访问的 OLE DB 数据源,而我们的数据互导操作,就是建立在这个函数之上。
         
        首先看一个T-SQL帮助中的示例,描述如下:

--下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。

SELECT *  
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')xactions



  
        如果你直接引用这个示例进行查询,那么肯定是通不过的。关键在于语句中的两个地方需要修改,一处在于Data Source处,双引号内为Excel表格的实际存放位置,要修改为你想查询的Excel表实际完整路径;二为最后的...xactions,其实这里代表的是要进行的某些动作,下面会讲,这里修改成用中括号包围的Excel表中工作表名字(加上一个$)就可以了,如[Sheet1$]。当然,还可以将Excel 5.0改为Excel 8.0,因为5.0是以前的老版本了。

        下面是实例说明:
     

/**//*1、插入Excel中的资料到现存的sql数据库表中(假设C盘有excel表book2.xls,book2.xls中有个工作表sheet1,sheet1中有两列id和FName;而同时sql数据库中也有一个表test):*/
insert into test SELECT id,FName
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\book2.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')[sheet1$]
--如果用select * ,则列的次序会乱,资料内容也会乱,无法插入成功,所以指定列名
-----------------------
/**//*2、插入excel表中资料到sql数据库并新建一个sql表(excel的定义和内容同上):*/
select convert(int,id)as id,FName into test7
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\book2.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')[sheet1$]
--在select 列中最好用convert进行显示类型转换,否则资料类型会不如预期。


  
        SQL Server与Excel的数据互导讲解完了,你明白了吗?而Access和Excel的基本一样,只是要去掉Extended properties声明。  


  **************************************************************************************************************
  看了文章后,在sql的查询分析器里试着用了用,成功!小激动一下。。
  可是问题并没有完全解决,我总不可能把sql语句发给客户,跟他说:你把这句语句复制到sql的查询分析器里执行下就好了。。。
  汗一汗,然后找了下jsp以及java执行存储过程的资料,找到了不少,不过大多都是执行oracle的例子。
  不过没事,反正执行方法是差不多的。然后分析了下那些例子。。。结果开始迷糊了,按上面存储过程的说法,我执行的语句中还要分析参数bcp,out,queryout等的参数。。。。给出的例子似乎简单了点。。。于是登陆ITPUB上去提问。。。结果人家大虾同志又给了一个oracle的例子。。
头大了。。。然后。。又提出了我的疑惑。。之后睡觉。。。
今天中午前再次登陆ITPUB,结果发现。。。问题的末帖还是我昨晚自己的帖子。。。。
没办法了,只好自己一点点来try了
然后我才发现我真的是很笨。。。其实早就应该自己试试看了。。。试过后才发现,其实根本不用担心参数的问题,直接把它们代入变量就可以了。。。汗阿
  具体执行方法:
String pro="{call master..xp_cmdshell (?)}";
CallableStatement cstmt = conn.prepareCall(pro);
String table="DGL.dbo.product";
String path="C:\\test1.xls";
cstmt.setString(1,"bcp "+table+" out "+path+" -c -q -S\"(local)\" -U\"sa\" -P\"\"");
cstmt.execute();
  语句中的反斜杠和双引号只要用反斜杠来转义掉,问题就ok了,我之前就是这一关没想到,以为要另外定义参数。。。结果就这么死在这里。。。幸好今天早上想到了。。HOHO~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298096-1-1.html 上篇帖子: SQL存储过程概述 下篇帖子: sql 更新语句 关联两张表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表