通过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
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
相关文章推荐
- C#通过反射来动态创建类对象并调用相关泛型函数(Excel数据自动导入到SQL Server数据库)
- c#大圣之路笔记——c# 通过页面把excel中的数据导入到DB中
- c#大圣之路笔记——c#通过页面把excel中的数据导入到DB中(全部)
- 将Excel数据直接导入DB
- 不支持直接到存储查询(DbSet、DbQuery、DbSqlQuery、DbRawSqlQuery)的数据绑定。应使用数据填充 DbSet (例如通过对 DbSet 调用 Load),然后绑定到本地数据
- 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:
- 通过excel把SQLSERVER2000数据导入到SQLITE中
- 通过EXCEL将access数据库的数据导入到mysql
- 将excel数据通过plsql导入oracle的问题
- 通过SQL语句直接实现Excel与数据库的导入导出
- Talend 从Excel导入Saleforce数据(一) 直接从salesforce lookup 性能的噩梦
- 仅限于IE的将table中的数据导入导出excel
- FSO script调用automation报错解决办法 及 导入excel
- excel数据导入到DB中(一)
- java中通过jacob调用dts进行数据导入导出
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
- BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
- Excel数据通过plsql 导入到Oracle
- SharePoint 2010 中有个新的列表模板“导入电子表格”可以直接导入Excel数据并创建为列表 .
- 通过Navicat将Excel表中的数据导入到数据库