加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:38:58 所属栏目:MsSql教程 来源:网络整理
导读:--用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)?? --

--用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'--此句需加引号

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读