分享

SQL Server 把image字段导出成文件(SQL Server把image字段导入导出)

 candidacy 2016-02-23
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  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约