分享

sql execl动态列名导入sql

 时间剧毒 2014-09-13
推荐资料自学网址:http://www./study.asp?vip=10241777   
sql 本身带有表格导入功能,为了某个目的写了个execl 表动态列名导入sql数据库的功能, 通用
/*
 **如果提示列名不符的话可能是把EXECL表的隐藏的列导入了. select  * from  LL  看下LL 表中的列是否有多余的! 重新复制到新的工作薄中去导入就行

*/
create  proc [dbo].[X-Execl导入](
@tname varchar(1000) , --要导入的表名
@fn varchar(1000) ,     --路径
@sheet1   varchar(1000)   --execl中表的名称
)
as
declare @s varchar(1000)
declare @ex varchar(1000)
declare @q varchar(1000)
declare @m varchar(1000)
declare @n varchar(1000)
declare @sql varchar(1000)
declare @zd varchar(1000)
declare @zdd varchar(1000)
declare @zfc varchar(1000)
declare @name varchar(1000)
declare @count int--用户记录条数
declare @sl int
declare @stra int
 
set @count=null
set @sl=1
set @zd= ''

if exists (select * from sysobjects where id = object_id(N'[dbo].LL') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
drop table LL

if exists (select * from sysobjects where id = object_id(N'[dbo].CC') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
drop table CC
--IF Object_id('Tempdb..#LL') IS NOT NULL  
--DROP TABLE #LL
--参数检测
if isnull(@fn,'')<>'' set @fn= @fn+'.xls'
if isnull(@sheet1,'')='' set @sheet1='sheet1'
 
--导入到表中
set @s ='''Microsoft.Jet.OLEDB.4.0'',''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 8.0 '''
set @q = 'SELECT  top 1 *  into LL FROM  OpenDataSource ('+@s+')...'+ @sheet1+'$'
exec(@q)
--select name from syscolumns where id = object_id('LL');     --列出表的列名
--select name from syscolumns where id = object_id(''+@tname+'');

IF EXISTS( select name from syscolumns where id = object_id('LL')
         and RTRIM(ltrim(name)) not in (  select RTRIM(ltrim(name)) from syscolumns where id = object_id(''+@tname+'')) )
 
    begin
 print '列名与表不一致,请核对!或重新复制资料到新EXECL工作薄中进行导入'
 end
else
begin
  if exists( select  name from syscolumns where id = object_id('LL'))
begin
--获取记录条数
select  @count =count(name) from (select name from syscolumns where id = object_id('LL')) A
--循环插入记录
while @count+1>@sl
begin
  select @name=name
  from (select row_number() over(order by name asc) as num,name from syscolumns
  where id = object_id('LL')) as T   where num=@sl
set @sl=@sl+1
set @zd=@zd+','+@name
end
set @stra=len(@zd)
set @zd=right(@zd,@stra-1)
set @zd=ltrim(rtrim(@zd))
set @zfc= replace(@zd,',',' as varchar(200))+cast( ')
set @zdd= 'select '+@zd+' into CC  from '+@tname+' where 1<>1'  --防止数据类型不匹配
exec (@zdd)
set @m ='''Microsoft.Jet.OLEDB.4.0'',''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 8.0 '''
set @n = 'insert into CC ('+@zd+') select '+@zd+' FROM  OpenDataSource ('+@m+')...'+ @sheet1+'$'
exec (@n) 

set @zd =' insert into '+@tname+'('+@zd +') select '+@zd+' from CC where cast('+@zfc+' as varchar(200)) is not null'
EXEC (@zd) 
print @ex
end
end
-------------

exec [X-Execl导入] 'table','d:\导入表','sheet4'

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多