【轉】Sqlserver -- bcp 實現二進位制檔案的匯入匯出
阿新 • • 發佈:2022-03-24
/*--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 --*/ 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 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
轉自:https://blog.csdn.net/qq_40996437/article/details/82528668