微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLServer 常用数据格式文件导入导出之二

--用bcp实现的存储过程if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1) drop procedure File2Tablegocreate procedure File2Table@servername varchar(200)  --服务器名,@username varchar(200)   --用户名,如果用NT验证方式,则为空'',@password varchar(200)   --密码,@tbname varchar(500)   --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表,@filename varchar(1000)  --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件自动用表名.txt,@isout bit      --1为导出,0为导入asdeclare @sql varchar(8000)if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表begin set @sql='bcp '+@tbname  +case when @isout=1 then ' out ' else ' in ' end  +' "'+@filename+'" /w'  +' /S '+@servername  +case when isnull(@username,'')='' then '' else ' /U '+@username end  +' /P '+isnull(@password,'') exec master..xp_cmdshell @sqlendelsebegin --导出整个数据库,定义游标,取出所有的用户表 declare @m_tbname varchar(250) if right(@filename,1)<>'/' set @filename=@filename+'/' set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U''' exec(@m_tbname) open #tb fetch next from #tb into @m_tbname while @@fetch_status=0 begin  set @sql='bcp '+@tbname+'..'+@m_tbname   +case when @isout=1 then ' out ' else ' in ' end   +' "'+@filename+@m_tbname+'.txt " /w'   +' /S '+@servername   +case when isnull(@username,'')='' then '' else ' /U '+@username end   +' /P '+isnull(@password,'')  exec master..xp_cmdshell @sql  fetch next from #tb into @m_tbname end close #tb deallocate #tb  endgoinsert intoopendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;DATABASE=C:/')...[aa#txt]-- aa#txtselect 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)fromopendatasource('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/a.xls')...[Sheet1$]-- Sheet1$)-- 如果你想直接插入并生成文本文件,就要用bcpdeclare @sql varchar(8000),@tbname varchar(50)-- 首先将excel表内容导入到一个全局临时表select @tbname='[##temp'+cast(newid() as varchar(40))+']' ,@sql='select 姓名,8)into '+@tbname+' fromopendatasource(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/a.xls'')...[Sheet1$]'exec (@sql)--  然后用bcp从全局临时表导出到文本文件set @sql='bcp "'+@tbname+'" out "c:/aa.txt" /S"(local)" /P"" /c'exec master..xp_cmdshell @sql--  删除临时表exec('drop table '+@tbname)-- 用bcp将文件导入导出到数据库的存储过程:--调用示例--数据导出 exec p_binaryIO 'zj','','acc_演示数据..tb','img','c:/zj1.dat'--数据导出 exec p_binaryIO 'zj','c:/zj1.dat',0if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id,N'IsProcedure') = 1)drop procedure [dbo].[p_binaryIO]GOCreate proc p_binaryIO    @servename varchar (30),    --服务器名称    @username varchar (30),        --用户名    @password varchar (30),        --密码    @tbname varchar (500),        --数据库..表名    @fdname varchar (30),        --字段名    @fname varchar (1000),        --目录+文件名,处理过程中要使用/覆盖:@filename+.bak    @tj varchar (1000)='',        --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀    @isout bit=1               --1导出((认),0导入ASdeclare @fname_in varchar(1000),    --bcp处理应答文件名    @fsize varchar(20),           --要处理的文件的大小    @m_tbname varchar(50),     --临时表名    @sql varchar(8000)--则取得导入文件的大小if @isout=1     set @fsize='0'elsebegin      create table #tb(        可选名 varchar(20),        大小 int,          创建日期 varchar(10),        创建时间 varchar(20),          上次写操作日期 varchar(10),        上次写操作时间 varchar(20),          上次访问日期 varchar(10),        上次访问时间 varchar(20),        特性 int)     insert into #tb        exec master..xp_getfiledetails @fname      select @fsize=大小 from #tb      drop table #tb    if @fsize is null    begin          print '文件未找到'      return     endend-- 生成数据处理应答文件set @m_tbname='[##temp'+cast(newid() as varchar(40))+']'set @sql='select * into '+@m_tbname+' from    (         select null as 类型        union all select 0 as 前缀        union all select '+@fsize+' as 长度        union all select null as 结束        union all select null as 格式     ) a'exec(@sql)select  @fname_in=@fname+'_temp',     @sql='bcp "'+@m_tbname+'" out "'+ @fname_in +'" /S"'+@servename    +case    when isnull(@username,'')=''    then ''      else '" /U"'+@username    end     +'" /P"'+isnull(@password,'')+'" /c'exec master..xp_cmdshell @sql--删除临时表set @sql='drop table '+@m_tbnameexec(@sql)if @isout=1begin set @sql='bcp "select top 1 '+@fdname+' from '  +@tbname+case isnull(@tj,'') when '' then ''   else ' where '+@tj end  +'" queryout "'+@fname  +'" /S"'+@servename  +case when isnull(@username,'')='' then ''   else '" /U"'+@username end  +'" /P"'+isnull(@password,'')  +'" /i"'+@fname_in+'"' exec master..xp_cmdshell @sqlendelsebegin --为数据导入准备临时表 set @sql='select top 0 '+@fdname+' into '  +@m_tbname+' from ' +@tbname exec(@sql) --将数据导入到临时表 set @sql='bcp "'+@m_tbname+'" in "'+@fname  +'" /S"'+@servename  +case when isnull(@username,'')  +'" /i"'+@fname_in+'"' exec master..xp_cmdshell @sql  --将数据导入到正式表中 set @sql='update '+@tbname  +' set '+@fdname+'=b.'+@fdname  +' from '+@tbname+' a,'  +@m_tbname+' b'  +case isnull(@tj,'') when '' then ''   else ' where '+@tj end exec(@sql) --删除数据处理临时表 set @sql='drop table '+@m_tbnameend--删除数据处理应答文件set @sql='del '+@fname_inexec master..xp_cmdshell @sqlgo-- 导入文本文件EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:/DT.txt -c -Sservername -Usa -Ppassword'-- 改为如下,不需引号EXEC master..xp_cmdshell 'bcp dbname..tablename in c:/DT.txt -c -Sservername -Usa -Ppassword'-- 导出文本文件EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:/DT.txt -c -Sservername -Usa -Ppassword'--此句需加引号

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐