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