SQL导入和导出Excel数据的语句

45次阅读
没有评论

共计 8444 个字符,预计需要花费 22 分钟才能阅读完成。

本篇内容主要讲解“SQL 导入和导出 Excel 数据的语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“SQL 导入和导出 Excel 数据的语句”吧!

-- 从 Excel 文件中, 导入数据到 SQL 数据库中, 很简单, 直接用下面的语句: /*===================================================================*/ -- 如果接受数据导入的表已经存在  insert into  表  select * from OPENROWSET(MICROSOFT.JET.OLEDB.4.0  , Excel 5.0;HDR=YES;DATABASE=c:\test.xls ,sheet1$) -- 如果导入数据并生成表  select * into  表  from OPENROWSET(MICROSOFT.JET.OLEDB.4.0  , Excel 5.0;HDR=YES;DATABASE=c:\test.xls ,sheet1$) /*===================================================================*/ -- 如果从 SQL 数据库中, 导出数据到 Excel, 如果 Excel 文件已经存在, 而且已经按照要接收的数据创建好表头, 就可以简单的用: insert into OPENROWSET(MICROSOFT.JET.OLEDB.4.0  , Excel 5.0;HDR=YES;DATABASE=c:\test.xls ,sheet1$) select * from  表  -- 如果 Excel 文件不存在, 也可以用 BCP 来导成类 Excel 的文件, 注意大小写: -- 导出表的情况  EXEC master..xp_cmdshell  bcp  数据库名.dbo. 表名  out  c:\test.xls  /c -/S 服务器名  /U 用户名  -P 密码  -- 导出查询的情况  EXEC master..xp_cmdshell  bcp  SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname  queryout  c:\test.xls  /c -/S 服务器名  /U 用户名  -P 密码  /*-- 说明: c:\test.xls  为导入 / 导出的 Excel 文件名. sheet1$  为 Excel 文件的工作表名, 一般要加上 $ 才能正常使用. --*/ -- 下面是导出真正 Excel 文件的方法: if exists (select * from dbo.sysobjects where id = object_id(N [dbo].[p_exporttb] ) and OBJECTPROPERTY(id, N IsProcedure) = 1) drop procedure [dbo].[p_exporttb] GO /*-- 数据导出 EXCEL  导出表中的数据到 Excel, 包含字段名, 文件为真正的 Excel 文件  , 如果文件不存在, 将自动创建文件  , 如果表不存在, 将自动创建表   基于通用性考虑, 仅支持导出标准数据类型  -- 邹建  2003.10(引用请保留此信息)--*/ /*-- 调用示例  p_exporttb @tbname= 地区资料 ,@path= c:\ ,@fname= aa.xls  --*/ create proc p_exporttb @tbname sysname, -- 要导出的表名  @path nvarchar(1000), -- 文件存放目录  @fname nvarchar(250)=  -- 文件名, 默认为表名  as declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000) -- 参数检测  if isnull(@fname,)=  set @fname=@tbname+ .xls  -- 检查文件是否已经存在  if right(@path,1) \  set @path=@path+ \  create table #tb(a bit,b bit,c bit) set @sql=@path+@fname insert into #tb exec master..xp_fileexist @sql -- 数据库创建语句  set @sql=@path+@fname if exists(select 1 from #tb where a=1) set @constr= DRIVER={Microsoft Excel Driver (*.xls)};DSN= READONLY=FALSE  + CREATE_DB= +@sql+ DBQ= +@sql else set @constr= Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties= Excel 8.0;HDR=YES  + DATABASE= +@sql+  -- 连接数据库  exec @err=sp_oacreate  adodb.connection ,@obj out if @err 0 goto lberr exec @err=sp_oamethod @obj, open ,null,@constr if @err 0 goto lberr /*-- 如果覆盖已经存在的表, 就加上下面的语句  -- 创建之前先删除表 / 如果存在的话  select @sql= drop table [+@tbname+]  exec @err=sp_oamethod @obj, execute ,@out out,@sql --*/ -- 创建表的 SQL select @sql= ,@fdlist=  select @fdlist=@fdlist+ ,[+a.name+]  ,@sql=@sql+ ,[+a.name+]   +case when b.name like  %char  then case when a.length 255 then  memo  else  text(+cast(a.length as varchar)+ )  end when b.name like  %int  or b.name= bit  then  int  when b.name like  %datetime  then  datetime  when b.name like  %money  then  money  when b.name like  %text  then  memo  else b.name end FROM syscolumns a left join systypes b on a.xtype=b.xusertype where b.name not in(image , uniqueidentifier , sql_variant , varbinary , binary , timestamp) and object_id(@tbname)=id select @sql= create table [+@tbname +](+substring(@sql,2,8000)+ )  ,@fdlist=substring(@fdlist,2,8000) exec @err=sp_oamethod @obj, execute ,@out out,@sql if @err 0 goto lberr exec @err=sp_oadestroy @obj -- 导入数据  set @sql= openrowset(MICROSOFT.JET.OLEDB.4.0 , Excel 8.0;HDR=YES;IMEX=1 ;DATABASE= +@path+@fname+ ,[ +@tbname+ $])  exec(insert into  +@sql+ ( +@fdlist+) select  +@fdlist+  from  +@tbname) return lberr: exec sp_oageterrorinfo 0,@src out,@desc out lbexit: select cast(@err as varbinary(4)) as  错误号  ,@src as  错误源,@desc as  错误描述  select @sql,@constr,@fdlist go if exists (select * from dbo.sysobjects where id = object_id(N [dbo].[p_exporttb] ) and OBJECTPROPERTY(id, N IsProcedure) = 1) drop procedure [dbo].[p_exporttb] GO /*-- 数据导出 EXCEL  导出查询中的数据到 Excel, 包含字段名, 文件为真正的 Excel 文件   如果文件不存在, 将自动创建文件   如果表不存在, 将自动创建表   基于通用性考虑, 仅支持导出标准数据类型  -- 邹建  2003.10(引用请保留此信息)--*/ /*-- 调用示例  p_exporttb @sqlstr= select * from  地区资料  ,@path= c:\ ,@fname= aa.xls ,@sheetname= 地区资料  --*/ create proc p_exporttb @sqlstr varchar(8000), -- 查询语句, 如果查询语句中使用了 order by , 请加上 top 100 percent @path nvarchar(1000), -- 文件存放目录  @fname nvarchar(250), -- 文件名  @sheetname varchar(250)=  -- 要创建的工作表名, 默认为文件名  as declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000) -- 参数检测  if isnull(@fname,)=  set @fname= temp.xls  if isnull(@sheetname,)=  set @sheetname=replace(@fname, . , #) -- 检查文件是否已经存在  if right(@path,1) \  set @path=@path+ \  create table #tb(a bit,b bit,c bit) set @sql=@path+@fname insert into #tb exec master..xp_fileexist @sql -- 数据库创建语句  set @sql=@path+@fname if exists(select 1 from #tb where a=1) set @constr= DRIVER={Microsoft Excel Driver (*.xls)};DSN= READONLY=FALSE  + CREATE_DB= +@sql+ DBQ= +@sql else set @constr= Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties= Excel 8.0;HDR=YES  + DATABASE= +@sql+  -- 连接数据库  exec @err=sp_oacreate  adodb.connection ,@obj out if @err 0 goto lberr exec @err=sp_oamethod @obj, open ,null,@constr if @err 0 goto lberr -- 创建表的 SQL declare @tbname sysname set @tbname= ##tmp_ +convert(varchar(38),newid()) set @sql= select * into [+@tbname+] from(+@sqlstr+) a  exec(@sql) select @sql= ,@fdlist=  select @fdlist=@fdlist+ ,[+a.name+]  ,@sql=@sql+ ,[+a.name+]   +case when b.name like  %char  then case when a.length 255 then  memo  else  text(+cast(a.length as varchar)+ )  end when b.name like  %int  or b.name= bit  then  int  when b.name like  %datetime  then  datetime  when b.name like  %money  then  money  when b.name like  %text  then  memo  else b.name end FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype where b.name not in(image , uniqueidentifier , sql_variant , varbinary , binary , timestamp) and a.id=(select id from tempdb..sysobjects where name=@tbname) if @@rowcount=0 return select @sql= create table [+@sheetname +](+substring(@sql,2,8000)+ )  ,@fdlist=substring(@fdlist,2,8000) exec @err=sp_oamethod @obj, execute ,@out out,@sql if @err 0 goto lberr exec @err=sp_oadestroy @obj -- 导入数据  set @sql= openrowset(MICROSOFT.JET.OLEDB.4.0 , Excel 8.0;HDR=YES ;DATABASE= +@path+@fname+ ,[ +@sheetname+ $])  exec(insert into  +@sql+ ( +@fdlist+) select  +@fdlist+  from [+@tbname+] ) set @sql= drop table [+@tbname+]  exec(@sql) return lberr: exec sp_oageterrorinfo 0,@src out,@desc out lbexit: select cast(@err as varbinary(4)) as  错误号  ,@src as  错误源,@desc as  错误描述  select @sql,@constr,@fdlist go declare @tbname sysname-- 要导出的表名, 注意只能是表名 / 视图名  declare @path nvarchar(1000)-- 文件存放目录  declare @fname nvarchar(250)-- 文件名, 默认为表名  set @tbname= salaryreports  set @path= e:\  set @fname= salaryreportsxls  declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000) -- 参数检测  if isnull(@fname,)=  set @fname=@tbname+ .xls  --drop table #tb -- 检查文件是否已经存在  if right(@path,1) \  set @path=@path+ \  create table #tb(a bit,b bit,c bit) set @sql=@path+@fname insert into #tb exec master..xp_fileexist @sql --select * from #tb -- 数据库创建语句  set @sql=@path+@fname if exists(select 1 from #tb where a=1) set @constr= DRIVER={Microsoft Excel Driver (*.xls)};DSN= READONLY=FALSE  + CREATE_DB= +@sql+ DBQ= +@sql else set @constr= Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties= Excel 5.0;HDR=YES  + DATABASE= +@sql+  -- 连接数据库  exec @err=sp_oacreate  adodb.connection ,@obj out if @err 0 goto lberr exec @err=sp_oamethod @obj, open ,null,@constr if @err 0 goto lberr -- 创建表的 SQL select @sql= ,@fdlist=  select @fdlist=@fdlist+ , +a.name ,@sql=@sql+ ,[+a.name+]   +case when b.name in(char , nchar , varchar , nvarchar) then  text(+cast(case when a.length 255 then 255 else a.length end as varchar)+ )  when b.name in(tynyint , int , bigint , tinyint) then  int  when b.name in(smalldatetime , datetime) then  datetime  when b.name in(money , smallmoney) then  money  else b.name end FROM syscolumns a left join systypes b on a.xtype=b.xusertype where b.name not in(image , text , uniqueidentifier , sql_variant , ntext , varbinary , binary , timestamp) and object_id(@tbname)=id select @sql= create table [+@tbname +](+substring(@sql,2,8000)+ )  ,@fdlist=substring(@fdlist,2,8000) exec @err=sp_oamethod @obj, execute ,@out out,@sql if @err 0 goto lberr exec @err=sp_oadestroy @obj -- 导入数据  set @sql= openrowset(MICROSOFT.JET.OLEDB.4.0 , Excel 5.0;HDR=YES ;DATABASE= +@path+@fname+ ,[ +@tbname+ $])  exec(insert into  +@sql+ ( +@fdlist+) select  +@fdlist+  from  +@tbname) return lberr: exec sp_oageterrorinfo 0,@src out,@desc out lbexit: select cast(@err as varbinary(4)) as  错误号  ,@src as  错误源,@desc as  错误描述  select @sql,@constr,@fdlist

到此,相信大家对“SQL 导入和导出 Excel 数据的语句”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计8444字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)