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


bcp 實現二進制文件的導入導出SQL SERVER 分類:程序資料2007.11.21 15:23 作者:suton | 評論:0 | 閱讀:462 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [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
--*/
Create proc p_binaryIO
@servename varchar (30),--服務器名稱
@username varchar (30), --用戶名
@password varchar (30), --密碼
@tbname varchar (500),  --數據庫..表名
@fdname varchar (30),  --字段名
@fname varchar (1000), --目錄+文件名,處理過程中要使用/覆蓋:@filename+_temp
@tj varchar (1000)='',  --處理條件.對於數據導入,如果條件中包含@fdname,請指定表名前綴
@isout bit=1   --1導出((默認),0導入
AS 
declare @fname_in varchar(1000) --bcp處理應答文件名
 ,@fsize varchar(20)   --要處理的文件的大小
 ,@m_tbname varchar(50)  --臨時表名
 ,@sql varchar(8000)

--則取得導入文件的大小
if @isout=1 
 set @fsize='0'
else
begin
 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
 end

end

--生成數據處理應答文件
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_tbname
exec(@sql)

if @isout=1
begin
 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 @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
  +case when isnull(@username,'')='' then '' 
   else '" /U"'+@username end
  +'" /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'
  +case isnull(@tj,'') when '' then ''
   else ' where '+@tj end
 exec(@sql)

 --刪除數據處理臨時表
 set @sql='drop table '+@m_tbname
end

--刪除數據處理應答文件
set @sql='del '+@fname_in
exec master..xp_cmdshell @sql
go

你可以通過這個鏈接引用該篇文章:http://suton.bokee.com/viewdiary.21444646.html 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM