您的位置:首页 > 其它

通过SP调用FSO直接把DB中table数据导入Excel

2010-04-20 16:48 471 查看
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Description: 通过SP调用FSO直接把DB中table数据导入Excel
-- =============================================

ALTER PROCEDURE [dbo].[HRC_CORE_REPORT_TO_EXCEL]
-- Add the parameters for the stored procedure here
@TableName nvarchar(100), --临时表全名
@Headers nvarchar(500), --标题清单,","分隔
@Columns nvarchar(500), --与标题对应的列名清单,","分隔
@ExcelFileName nvarchar(500) --Excel文件物理路径

--exec HRC_CORE_REPORT_TO_EXCEL 'test','姓名,性别,年龄,电话','sname,sex,age,@tel','d:/report/test.xls'

as
begin
-- set nocount on added to prevent extra result sets from
-- interfering with select statements.
set nocount on

declare
@fso int,
@err int,
@fileExist int,
@folderExist int,
@createOK int,
@folderResult int

-- Insert statements for procedure here

----------------------begin Split @Columns----------------------
declare @itemsIndex int
set @itemsIndex = 1
-- declare @revolve int
-- select @revolve = dbo.Get_StrArrayLength(@Columns,',')
-- declare @itemsNumber int
-- set @itemsNumber = @revolve --自动计算输入的columns个数(即计算","个数再加1)
declare @splitResult nvarchar(max)
set @splitResult= ''
declare @result nvarchar(500)

-- raiserror('test',16,1)

exec SP_OPERATE_STRINGLIST_SPLIT @Columns, @itemsIndex, @result out,','
set @itemsIndex = @itemsIndex + 1
declare @exsit_at int --判断列名开头是否带有"@",使列名开头带"@"的变量在处理时加上"=",这样能在Excel中保留数字前面的"0",如"00123"。
select @exsit_at = patindex('%@%', @result)
if @exsit_at = 0 --0:表示没有"@"
begin
select @splitResult = @splitResult + '''' + '"' + '''' + '+' + 'convert(nvarchar,'+@result+')'
-- print @splitResult
end
else
begin
set @result = rtrim(ltrim(replace(@result,'@',''))) --去除"@"和左右两边多余的空格
select @splitResult = @splitResult + '''' + '="' + '''' + '+' + 'convert(nvarchar,'+@result+')'
-- print @splitResult
end
-- print @result
--if (@result is null)
while ( @result != '' )
begin
-- print 123
exec SP_OPERATE_STRINGLIST_SPLIT @Columns, @itemsIndex, @result out,','
if ( @result is null )
begin
set @result = ''
end
else
begin
select @exsit_at = patindex('%@%', @result)
if @exsit_at = 0 --0:表示没有"@"
begin
select @splitResult = @splitResult+'+''" "''+'+ 'convert(nvarchar,'+@result+')'
end
else
begin
set @result = rtrim(ltrim(replace(@result,'@',''))) --去除"@"和左右两边多余的空格
select @splitResult = @splitResult+'+''" ="''+'+ 'convert(nvarchar,'+@result+')'
end
set @itemsIndex = @itemsIndex + 1
end
end
--print len(@splitResult)
-- select @splitResult = right(@splitResult,len(@splitResult)-4)
-- print @splitResult
select @splitResult = rtrim(ltrim(@splitResult)) + '+' + '''"'''
-- print @splitResult
select @splitResult = replace(@splitResult,' ',' ') --将空格转化为Tab
-- print @splitResult
select @splitResult = 'select ' + @splitResult + 'as Row from '+@TableName+''
-- print @splitResult
select @splitResult = 'declare pCursor cursor for ' + @splitResult --将游标遍历@Columns中数据的功能一起写入字符串
-- print @splitResult
----------------------end Split @Columns------------------------

exec @err = sp_OACreate 'Scripting.FileSystemObject', @fso out --创建FSO
if @err <> 0
begin
print 'error create Scripting.FileSystemObject'
return
end

declare @folderName varchar(500) --获取文件目录
select @folderName = left(@ExcelFileName,len(@ExcelFileName)-charindex('/',reverse(@ExcelFileName))+1)
-- print @folderName

exec @err = sp_OAMethod @fso, 'FolderExists', @folderExist out, @folderName --检查文件目录是否存在,不存在则创建目录
if @err <> 0
begin
-- EXEC sp_OAGetErrorInfo @fso
print 'error create FolderExists'
return
end
else
begin
if @folderExist = 0
begin
exec @createOK = sp_OAMethod @fso, 'CreateFolder', @folderResult out, @folderName --创建文件夹
-- print @folderResult
if @createOK <> 0
begin
exec sp_OAGetErrorInfo @fso
print 'error create CreateFolder'
return
end
end
end

exec @err = sp_OAMethod @fso, 'CreateTextFile', @fileExist out, @ExcelFileName, true --检查文件是否存在,不存在就创建,存在就覆盖(true为覆盖)
if @err <> 0
begin
EXEC sp_OAGetErrorInfo @fso
print 'error create CreateTextFile'
return
end
else
begin
select @Headers = replace(@Headers,',',' ') --将","改成Tab
-- select @Headers = replace(@Headers,' ','') --去掉多余的空格
begin try
exec sp_OAMethod @fileExist, 'WriteLine', null, @Headers --写入Headers
end try
begin catch
select
error_number() as ErrorNumber,
error_message() as ErrorMessage;
end catch
-- if @err <> 0
-- begin
-- print 'error create CreateTextFile.WriteLine.Headers'
-- return
-- end
declare @cols nvarchar(max)
-- declare pCursor cursor for --游标遍历@Columns中的数据,已经写入@splitResult
exec(@splitResult)
-- print @splitResult
-- return
open pCursor
fetch next from pCursor into @cols
while @@fetch_status = 0
begin
begin try
exec sp_OAMethod @fileExist, 'WriteLine', null, @cols --写入Columns
fetch next from pCursor into @cols

end try
begin catch
select
error_number() as ErrorNumber,
error_message() as ErrorMessage;
end catch
-- if @err <> 0
-- begin
-- print 'error create CreateTextFile.WriteLine.Columns'
-- return
-- end
-- else
-- fetch next from pCursor into @cols
end
close pCursor
deallocate pCursor
end

----------------------begin 释放FSO----------------------
exec sp_OADestroy @fso
exec sp_OADestroy @fileExist
exec sp_OADestroy @folderExist
exec sp_OADestroy @folderResult
----------------------end 释放FSO------------------------

end



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐