砂拉豆 发表于 2018-10-18 07:23:51

sql server导出为dbf 存储过程

  CREATE proc p_exporttb
  @sqlstr varchar(8000),   --要导出的查询名
  @pathnvarchar(1000),   --文件存放目录
  @fnamenvarchar(250)='temp.dbf',--文件名,默认为temp
  @over bit=0       --是否覆盖已经存在的文件,如果不覆盖,则直接追加
  as
  declare @err int,@src nvarchar(255),@desc nvarchar(255),@outint
  declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlistvarchar(8000)
  --参数检测
  if isnull(@fname,'')='' set @fname='temp.dbf'
  --检查文件是否已经存在
  if right(@path,1)'/' set @path=@path+'/'
  createtable #tb(a bit,b bit,c bit)
  set @sql=@path+@fname
  insert into #tb execmaster..xp_fileexist @sql
  if exists(select 1 from #tb where a=1)
  if@over=1
  begin
  set @sql='del '+@sql
  exec master..xp_cmdshell @sql,no_output
  end
  else
  set@over=0
  else
  set @over=1
  --数据库创建语句
  set @sql=@path+@fname
  set@constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="dBASE5.0;'
  +'HDR=NO;DATABASE='+@path+'"'
  /*
  set @constr='Provider=MSDASQL.1;Persist Security Info=False;Driver={MicrosoftVisual FoxPro Driver};SourceType=DBF;UID=;PWD=;DBQ='+@path+';'
  set @constr='Driver={Microsoft FoxPro VFP Driver(*.dbf)};UID=;PWD=;SourceDB='+@path+';SourceType=DBF;Exclusive=No;'
  */
  --创建表的SQL
  declare@tbname sysname
  set @tbname='##tmp_'+convert(varchar(38),newid())
  set@sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
  exec(@sql)
  --连接数据库
  exec @err=sp_oacreate 'adodb.connection',@obj out
  if@err0 goto lberr
  exec @err=sp_oamethod @obj,'open',null,@constr
  if @err0 gotolberr
  --创建表的SQL
  select @sql='',@fdlist=''
  select@fdlist=@fdlist+','+a.name
  ,@sql=@sql+',['+a.name+'] '
  +case whenb.name in('char','nchar','varchar','nvarchar') then
  'text('+cast(casewhen a.length>250 then 250 else a.length end as varchar)+')'
  whenb.name in('tynyint','int','bigint','tinyint') then 'int'
  when b.namein('smalldatetime','datetime') then 'datetime'
  when b.namein('money','smallmoney') then 'money'
  else b.name end
  FROMtempdb..syscolumns a left join tempdb..systypes b ona.xtype=b.xusertype
  where b.name notin('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')

  anda.id=(select>  select @sql='create table['+@fname
  +']('+substring(@sql,2,8000)+')'
  ,@fdlist=substring(@fdlist,2,8000)
  if @over=1
  begin
  exec @err=sp_oamethod @obj,'execute',@outout,@sql
  if @err0 goto lberr
  end
  exec @err=sp_oadestroy @obj
  set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''dBase5.0;DATABASE='
  +@path+''',''select* from ['+@fname+']'')'
  --导入数据
  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:
  selectcast(@err as varbinary(4)) as 错误号
  ,@src as 错误源,@desc as 错误描述
  select@sql,@constr,@fdlist
  GO
  注意:p_exporttb 存储过程必须在查询分析器中执行新建
  如在企业管理器中新建存储过程
  ANSI_NULLS 和 ANSI_WARNINGS
  设置的保留问题,存储过程创建后,创建时的ANSI_NULLS 和 ANSI_WARNINGS 选项就会一直保留.
  而在在查询分析器中建,是因为查询分析器的默认ANSI_NULLS 和 ANSI_WARNINGS 设置是on
  完整的执行代码: p_exporttb 'select top 10 * From wt_user','c:/','wt_user.dbf',1

页: [1]
查看完整版本: sql server导出为dbf 存储过程