最近碰到要導出大數據的EXCEL, 發現用ADO.NET導出特別慢,所以就寫了個存儲過程直接用數據庫來導出. 下面是代碼:
但是這樣導出的EXCEL文件是沒有什麼樣式的EXCEL文件,而且只支持本地導出(WEB服務器和數據庫服務器是在同一臺機器上)~..... 在存儲過程裏面都有註釋,其實也蠻簡單的,主要是用到了網上很容易搜索到的BCP命令~ 用xp_cmdshell 執行它而已.
- create procedure procGenexcelwithcolumns
- (
- @db_name varchar(100),
- @table_name varchar(100),
- @file_name varchar(100)
- )
- as
- --Generate column names as a recordset
- declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100)
- select
- @columns=coalesce(@columns+',','')+column_name+' as ['+column_name+']'
- from
- information_schema.columns
- where
- table_name=@table_name
- select @columns=''''''+replace(replace(@columns,' as ',''''' as '),',',',''''')
- --Create a dummy file to have actual data
- select @data_file=substring(@file_name,1,len(@file_name)-charindex('/',reverse(@file_name)))+'/data_file.xls'
- --Generate column names in the passed EXCEL file
- set @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c -q -S"192.168.1.2" -U"sa" -P"sasasa"'''
- exec(@sql)
- -- From 飛鳥工作室 Rights reserved
- --Generate data in the dummy file
- set @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c -q -S"192.168.1.2" -U"sa" -P"sasasa"'''
- exec(@sql)
- --Copy dummy file to passed EXCEL file
- set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> '+@file_name+''''
- exec(@sql)
- --Delete dummy file
- set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
- exec(@sql)
- -- From 飛鳥工作室 Rights reserved
調用實例:
procGenexcelwithcolumns 'test','vitemsoldreport','d:/itemsold.xls'
test:數據庫名,'vitemsoldReport'視圖名',itemsold.xls 是路徑
注意:數據量不能超過EXCEL每張SHEET能承受的最大行數:65536