ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[p_binaryIO]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[p_binaryIO] GO /*--bcp 实现二进制文件的导入导出 支持image,text,ntext字段的导入/导出 image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等 text,ntext适合于文本数据文件 注意:导入不会新增记录,所以导入前要对表进行初始化,即插入记录 导入时,将覆盖满足条件的所有行 导出时,将把所有满足条件的行导出到指定文件中 此存储过程仅用bcp实现 --邹建 2003.08(引用请保留此信息)---*/ /*--调用示例 --数据导出 exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat' --数据导入 exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat','',0 --*/ Createproc p_binaryIO @servenamevarchar (30),--服务器名称 @usernamevarchar (30), --用户名 @passwordvarchar (30), --密码 @tbnamevarchar (500), --数据库..表名 @fdnamevarchar (30), --字段名 @fnamevarchar (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+_temp @tjvarchar (1000)='', --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀 @isoutbit=1--1导出((默认),0导入 AS declare@fname_invarchar(1000) --bcp处理应答文件名 ,@fsizevarchar(20) --要处理的文件的大小 ,@m_tbnamevarchar(50) --临时表名 ,@sqlvarchar(8000) --则取得导入文件的大小 if@isout=1 set@fsize='0' else begin createtable #tb(可选名 varchar(20),大小 int ,创建日期 varchar(10),创建时间 varchar(20) ,上次写操作日期 varchar(10),上次写操作时间 varchar(20) ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int) insertinto #tb exec master..xp_getfiledetails @fname select@fsize=大小 from #tb droptable #tb if@fsizeisnull begin print'文件未找到' return end end --生成数据处理应答文件 set@m_tbname='[##temp'+cast(newid() asvarchar(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 +casewhenisnull(@username,'')=''then'' else'' /U''+@usernameend +'' /P''+isnull(@password,'')+'' /c' exec master..xp_cmdshell @sql --删除临时表 set@sql='drop table '+@m_tbname exec(@sql) if@isout=1 begin set@sql='bcp 'select top 1 '+@fdname+' from ' +@tbname+caseisnull(@tj,'') when''then'' else' where '+@tjend +'' queryout ''+@fname +'' /S''+@servename +casewhenisnull(@username,'')=''then'' else'' /U''+@usernameend +'' /P''+isnull(@password,'') +'' /i''+@fname_in+''' exec master..xp_cmdshell @sql end else begin --为数据导入准备临时表 set@sql='select top 0 '+@fdname+' into ' +@m_tbname+' from '+@tbname exec(@sql) --将数据导入到临时表 set@sql='bcp ''+@m_tbname+'' in ''+@fname +'' /S''+@servename +casewhenisnull(@username,'')=''then'' else'' /U''+@usernameend +'' /P''+isnull(@password,'') +'' /i''+@fname_in+''' exec master..xp_cmdshell @sql --将数据导入到正式表中 set@sql='update '+@tbname +' set '+@fdname+'=b.'+@fdname +' from '+@tbname+' a,' +@m_tbname+' b' +caseisnull(@tj,'') when''then'' else' where '+@tjend exec(@sql) --删除数据处理临时表 set@sql='drop table '+@m_tbname end --删除数据处理应答文件 set@sql='del '+@fname_in exec master..xp_cmdshell @sql go 你可以通过这个链接引用该篇文章:http://suton./viewdiary.21444646.html |
|