`

执行SQL存储过程/SQL与excel互导

阅读更多

昨天。。。客户要求,说要把数据库里的数据导出到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~

 
分享到:
评论

相关推荐

    SQL与Excel的互导

    以下是对SQL与Excel互导过程的详细解析。 1. **Excel数据导入到SQL数据库**: - **数据预处理**:在导入前,确保Excel中的数据格式正确,无误。这包括检查日期、数字和文本格式,以及删除或处理异常值。 - **创建...

    sql server与excel互导

    ### SQL Server与Excel数据互导的关键知识点 #### 一、SQL Server与Excel数据交互的基本原理 在企业级应用中,经常需要将SQL Server中的数据导出到Excel进行进一步的数据分析或者将Excel中的数据导入到SQL Server...

    mysql与excel互导

    在进行MySQL与Excel互导时,需注意数据格式的一致性,避免因类型不匹配导致导入失败。同时,确保在处理敏感数据时遵循安全规范,如使用预编译的SQL语句防止SQL注入攻击。对于大量数据,应考虑性能优化,比如分批导入...

    sqlServer定时器以及两个服务器间的数据互导存储过程

    sqlserver定时器的设置,跨服务器的数据交接,里面有存储过程例子对A,B两个sqlserver服务器数据的互导,以及跨服务器需要设置的环境截图详解

    access与excel互导

    - **从Excel导入到Access**:同样,先用Excel Interop读取Excel工作表内容到内存,如`Range`对象,然后通过`OleDbCommand`执行SQL插入语句将数据导入Access。 5. **错误处理和资源释放**:在操作完成后,记得关闭...

    基于ASP.NET的SQL与EXCEL数据互导的研究与实现.pdf

    基于ASP.NET的SQL与EXCEL数据互导的研究与实现.pdf

    Excel和SqlServer间相互导入实例

    - 首先,执行SQL查询从SQL Server获取所需数据,可以是SELECT语句或者存储过程。 - 将查询结果填充到一个新的DataSet中。 - 创建一个OleDbConnection连接到Excel文件,然后使用OleDbCommand和OleDbDataAdapter...

    JAVA实现mysql与excel数据互导

    总的来说,JAVA实现MySQL与Excel数据互导是一项实用的技能,它结合了数据库操作和文件处理的知识,对于数据处理人员和开发人员来说都十分关键。通过学习和理解这一过程,你将能够更有效地管理和分析数据,提升工作...

    mysql 与word和excel互导数据

    ### MySQL与Word和Excel互导数据详解 #### 一、MySQL导出数据至Excel **1. 创建测试数据表** 为了演示如何将MySQL中的数据导出到Excel中,首先需要创建一个简单的数据表并插入一些数据。以下是创建数据表及插入...

    sql,access导出表结构,互导

    本文将深入探讨如何在SQL与Access之间导出表结构以及进行互导操作。 首先,让我们了解SQL。SQL是一种用于管理关系数据库的标准语言,它支持创建、查询、更新和删除数据。在SQL中,表结构包括字段(列)定义、数据...

    powerdesigner和sql之间的互导

    ### PowerDesigner与SQL之间的互导知识点详解 #### 1. 实验目的 - **使用PowerDesigner进行数据库设计:** 本实验旨在通过使用PowerDesigner这一专业数据库建模工具,完成数据库概念模型的设计,并在此基础上进一步...

    excel和access互导.zip

    1. **Access数据库操作**:包括创建表、设计字段、设置关系以及执行SQL查询等,这些都是在Access中管理数据的基础。 2. **Excel的数据格式化**:理解Excel的工作簿、工作表、单元格等概念,以及如何设置数据格式、...

    JAVA实现mysql与excel数据互导Java实用源码整理learns.

    本篇文章将详细讲解如何使用Java实现MySQL数据库与Excel数据的互导,以及如何利用提供的源码进行学习和实践。 首先,我们需要理解两个核心概念:Java的数据库连接(JDBC)和处理Excel文件的库。JDBC是Java标准版的...

    EXCEL,TXT文档数据和ORACLE数据互导的方法

    ### EXCEL、TXT文档数据与ORACLE数据互导方法详解 在日常工作与数据分析过程中,我们经常需要处理来自不同来源的数据,比如Excel表格、文本文件(TXT)以及数据库系统中的数据。尤其是在使用Oracle数据库时,如何...

    VB.Net2010Access与Excel互导(高清视频+源码).zip

    本资源"VB.Net2010Access与Excel互导(高清视频+源码).zip"提供了一个详细的学习教程,通过高清视频和实际可运行的源代码,帮助开发者掌握这一技能。 首先,Access是微软公司推出的一种关系型数据库管理系统,它具有...

    DataGridView与Excel文件的互导

    在.NET框架中,`DataGridView...通过学习和理解这些代码,你可以更好地掌握`DataGridView`与Excel文件互导的具体实现。实践中,可以根据实际需求调整代码,比如增加数据过滤、格式转换等功能,以满足更复杂的应用场景。

    C#利用Com组件实现的Sql与Excel相互导入导出,使用XML配置即可

    在这个项目中,我们使用了C#通过COM组件来实现Sql与Excel之间的数据导入导出,并且借助XML配置文件进行灵活的设置。这种方法能够极大地提高代码的可维护性和可扩展性。 首先,我们要理解什么是COM组件。COM...

    JAVA实现mysql与excel数据互导javalearnsa资料分享

    这个“JAVA实现mysql与excel数据互导javalearnsa资料分享”提供的资源,就是帮助开发者学习如何使用Java来实现这种数据交互功能。 首先,我们需要了解Java中用于处理Excel文件的库。Apache POI是一个广泛使用的开源...

Global site tag (gtag.js) - Google Analytics