sql 二進位制檔案的匯入匯出

2021-09-06 03:44:04 字數 4004 閱讀 1989

/*--bcp-二進位制檔案的匯入匯出

支援image,text,ntext欄位的匯入/匯出

image適合於二進位制檔案;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]

gocreate   proc   p_binaryio

@servename   varchar   (30),--伺服器名稱

@username   varchar   (30),   --使用者名稱

@password   varchar   (30), --密碼

@tbname   varchar   (500),   --資料庫..表名

@fdname   varchar   (30),   --欄位名

@fname   varchar   (1000), --目錄+檔名,處理過程中要使用/覆蓋:@filename+.bak

@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

endend

--生成資料處理應答檔案

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

endelse

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

二進位制檔案

本質上是文字檔案是把檔案資訊先轉化成以字元編碼的ascii碼,再儲存ascii的二進位制 而二進位制檔案是直接把檔案資訊編碼成二進位制儲存。因此在讀取的時候要考慮記憶體中二進位制 應該怎麼樣解釋。二進位制檔案的讀取是是要告訴元素的型別 編碼方式 文字檔案則預設為char型別。文字檔案是一種特殊的二進...

二進位制檔案

二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...

二進位制檔案

二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...