1. 程式人生 > >用SQL查詢分析器操縱Excel及匯入匯出資料

用SQL查詢分析器操縱Excel及匯入匯出資料

SQL SERVER 和EXCEL的資料匯入匯出

通常的方法是使用圖形介面的dts工具,但發覺有些使用命令列介面的方式更簡單



1、在SQL SERVER裡查詢Excel資料:



-- ======================================================



SELECT *



FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',



'Data Source="c:/book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]







-------------------------------------------------------------------------------------





2、將Excel的資料匯入SQL server :



-- ======================================================



SELECT * into newtable



FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',



'Data Source="c:/book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]





-------------------------------------------------------------------------------------

結論: 這兩個功能都使用了openDatasource函式來返回一個專用的資料庫伺服器,作為4部分名稱的第一部分。



OPENDATASOURCE ( provider_name, init_string )



provider_name: 如Sqloledb, Microsoft.Jet.OLEDB.4.0等

init_string: 連線字串,如'Data Source="c:/book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0'

提供了伺服器名,對Excel來說就是檔名

使用者ID,密碼

Extended properties: 我試了填Excel 5.0 或8.0都可以,其他不行

最後的[Sheet1$]是頁名,這裡當做表名用,注意一定要加上$



另外一個例子,用來取其他sql server伺服器上的資料:

SELECT *

FROM OPENDATASOURCE(

'SQLOLEDB',

'Data Source=ServerName;User ID=MyUID;Password=MyPass'

).Northwind.dbo.Categories



哈哈,眼熟多了吧,一樣的!

但是這個用法只用於ad hoc, 對於大量的操作還是用linked server比較正規, linked server這麼加:



EXEC sp_addlinkedserver 'Excel',

'Jet 4.0',

'Microsoft.Jet.OLEDB.4.0',

'D:/book1.xls',

NULL,

'Excel 5.0'

GO



加好後,這麼查詢(還是需要$):

select * from excel...Events$







3、將SQL SERVER中查詢到的資料導成一個Excel檔案



-- ======================================================



T-SQL程式碼:



EXEC master..xp_cmdshell 'bcp 庫名.dbo.表名 out c:/Temp.xls -c -q -S"servername" -U"sa" -P""'





引數:S 是SQL伺服器名;U是使用者;P是密碼



說明:還可以匯出文字檔案等多種格式



例項:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:/temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'



EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:/ authors.xls -c -Sservername -Usa -Ppassword'



EXEC master..xp_cmdshell 'bcp "SELECT * FROM sysdatabases" queryout C:/sysdb.xls -c -q -S"(local)" -U"sa" -P""'



注意: 匯出表用out, 匯出查詢結果用queryout



在VB6中應用ADO匯出EXCEL檔案程式碼:



Dim cn As New ADODB.Connection



cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"



cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 庫名.dbo.表名" queryout E:/DT.xls -c -Sservername -Usa -Ppassword'"



------------------------------------------------------------------------------------------------





4、在SQL SERVER裡往Excel插入資料(匯出新檔案可以用bcp,但增量插入需要opendatasource,然後可以用標準的sql語句來操作了):



-- ======================================================



插入單行資料:

insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',



'Data Source="c:/Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3)





插入多行(資料集)

insert into

opendatasource('Microsoft.Jet.OLEDB.4.0',

'Data Source="D:/book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Events$] (ID,Name,Descrption)

select ID+50, name, descrption from excel...events$