myssh
 

SQL Code
go

/*--数据导出EXCEL

导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
--作者: 邹建 --*/

/*--调用示例

p_exporttb @tbname=\'地区资料\',@path=\'c:\\',@fname=\'aa.xls\'
--*/
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   
  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)  
   print @sqlstr
  --参数检测  
  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="mailto:\'+@sql+\'%22;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 

/*--导出,以下是我的调用示例,上面的存储过程都是出自邹建笔下,顶啊--*/
go
create proc outExcel
@ToID int,@stortype int,@os int,@Url varchar(60)
as
declare @Name nvarchar(60)
set @Name = \'盘点单\'+(select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),\'-\',\'\'),\' \',\'\'),\':\',\'\'))
set @Name = @Name+\'.xls\'
declare @sqlstr varchar(8000)
set @sqlstr=\'select ID,Code as 编码,[Name] as 名称,Unit as 单位,Model as 产品型号,(SELECT isnull(sum(CC0),0)
FROM cInventory WHERE (GoodsID = cgoods.ID)
AND (ToID=\'+ltrim(@ToID)+\')
and stortype=\'+ltrim(@stortype)+\' and os=\'+ltrim(@os)+\')
as 账面库存,\'\'0\'\' as 实际数量,ImgNum as 货号,\'\'\'\' as 备注
from cgoods\'
exec p_exporttb @sqlstr,@Url,@Name,\'盘点单\'

/*--导入--*/
SELECT * FROM OpenDataSource(
 \'Microsoft.Jet.OLEDB.4.0\',\'Data Source="d:\盘点单.xls";User ID=Admin;Password=;Extended properties=Excel 5.0\')
...[盘点单$]

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-04-15
  • 2021-12-09
  • 2021-12-04
  • 2021-12-04
  • 2021-12-08
  • 2021-12-12
  • 2022-12-23
猜你喜欢
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2022-12-23
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
相关资源
相似解决方案