也谈SQL Server表与Excel、Access数据互导

要用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表中改动一下再保存看看。

    实际例子与说明如下:
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*如果要将表整个导出至Excel的话*/
EXEC  master..xp_cmdshell  ' bcp northwind.dbo.orders out c:\Book1.xls -c -q -S"(local)" -U"sa" -P"" '

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

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

-- -----------------------------------------
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*如果要利用查询来导出部分字段至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是以前的老版本了。

        下面是实例说明:
    
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*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 * ,则列的次序会乱,资料内容也会乱,无法插入成功,所以指定列名
-----------------------
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*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声明。 

=======================
Delphi示例(導出為excel表):
ADOQ1.Close;
       ADOQ1.SQL.Clear;
       sqltrs :
=
         
' INSERT INTO CTable (Name1,Sex,ID) ' +
         
'  SELECT ' +
         
'  姓名,性别,身份证号 ' +
         
'  FROM [excel 8.0;database= '   +  XlsName  +   ' ].[sheet1$] ' ;
       ADOQ1.Parameters.Clear;
       ADOQ1.ParamCheck:
= false ;
       ADOQ1.SQL.Text :
=  sqltrs;
       ADOQ1.Execsql;

// 注意中文字段名左右兩邊不能有空格

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-666202/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16436858/viewspace-666202/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值