网事如风

    网如风,事如风,爱如风,情如风,,,
都随风起,随风去

统计

Microsoft Source

My Friends

My Links

Program

最新评论

也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句)

        今天,那个新来的MM又来问我如何使用T-SQL语句进行 SQL Server表与Excel、Access数据互导的问题了,看来她是吃定我了,,,什么时候是个尽头啊,,,,,555555555,,,,,
         不过也好,正好写些东西,免得以后忘记了,或许对大家还有些帮助,,,,呵呵,,,只能自我安慰一下了。。

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

    实际例子与说明如下:
A,将表整个导出至Excel:
EXEC master..xp_cmdshell 'bcp northwind.dbo.orders out c:\Book1.xls -c -q -S"(local)" -U"sa" -P""'

注:
××northwind.dbo.orders,为数据库名+拥有者+表名

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

-------------------------------------------
B,利用查询来导出部分字段至Excel:
EXEC master..xp_cmdshell 'bcp "SELECT orderid,cutomerid,freight FROM northwind..orders ORDER BY orderid" queryout C:\ Book1.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 



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

实例说明如下: 
    
A、插入Excel中的资料到现存的sql数据库表中(假设C盘有excel表book1.xls,book1.xls中有个工作表sheet1,sheet1中有两列id和Name;而同时sql数据库中也有一个表A):
insert into A SELECT id,Name
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 9.0')[sheet1$]
注意:
不要用select * ,否则列的次序会乱,资料内容也会乱,无法插入成功,慎重!!易错。 

B、插入excel表中资料到sql数据库并新建一个sql表(excel的假设同上):
select convert(int,id)as id,Name into A
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 9.0')[sheet1$]
注意:
在select 列中最好用convert进行显示类型转换,否则资料类型可能会不如预期。 


3,补充:以上是 SQL Server与Excel的数据互导,而Access和Excel的基本一样,只是要去掉Extended properties声明,一样easy。 

下面补充一个Delphi的例子:(导出为excel表): 
        ADOQ1.Close; 
        ADOQ1.SQL.Clear; 
       QSTR :=  'INSERT INTO CTable (Name1,Sex,ID) SELECT Name,Sex,IDNo FROM [excel 9.0;database=' + XlsName + '].[sheet1$]';
       ADOQ1.Parameters.Clear;
       ADOQ1.ParamCheck:=FALSE;
       ADOQ1.SQL.Text := QSTR;
       ADOQ1.Execsql;

哈哈,不会有问题了吧?
转载请注明出处,谢谢。

posted on 2007-03-22 13:41 网事如风 阅读(1391) 评论(7)  编辑 收藏 引用 所属分类: 技术

评论

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-03-22 22:07 paerxiushi

将Excel表格导入到SQL Server中,可以用Bulk Insert语句,它是正规的SQL语句,可读性更好.  回复  更多评论   

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-03-23 12:25 网事如风

谢谢,又多一招。  回复  更多评论   

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-03-26 12:01 firefox

分析的不错  回复  更多评论   

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-03-28 12:43 风筝

这个挺实用  回复  更多评论   

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-03-29 06:28 网事如风

谢谢,有用就好。  回复  更多评论   

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-03-29 06:29 网事如风

本周上课,没时间写东东。  回复  更多评论   

# re: 也谈SQL Server表与Excel、Access数据互导(使用T-SQL语句) 2007-06-18 21:06 火狐

实用,给客户做网站,客户给的我一些资料全是EXCEL做的,让弄到网站数据库里去,亏得你的经验分享,不然一条条加,我不疯了才怪,感谢!  回复  更多评论   

只有注册用户登录后才能发表评论。