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]