將文件導入到SQL server數據庫表中的字段中


 

一、在要執行的sql server數據庫a中執行如下腳本,創建存儲過程sp_textcopy

/* 將二進制文件導入、導出到數據庫相應字段列中 */ CREATE PROCEDURE sp_textcopy( @login varchar (1000),              --用戶名 @password varchar (1000),       --密碼 @dbname varchar (1000),         --數據庫名 @tbname varchar (1000),          --表名 @keyfield varchar (1000),          --主鍵名稱 @colname varchar (1000),         --圖片二進制列名 @filename varchar (1000),         --導入或導出的文件名和文件路徑 @whereclause varchar (1000),  --條件 @direction char(1),            --導入或導出標識 @isIdentity bit=1, @isAdd bit = 1)             --1增加(默認),0修改 AS declare @exec_str varchar (8000) declare @sql nvarchar(1000) declare @guid varchar(1000) declare @id int declare @filter varchar(1000)

if(@direction = 'I')  if (@isAdd = 1)   begin    if (@isIdentity =1)        begin     exec('insert into ' + @tbname + '(' + @colname + ') select 0x')     set @sql ='select @id = @@IDENTITY'     exec sp_executesql @sql ,N'@id int output',     @id output     set @filter = 'where ' + @keyfield + '=' + convert(varchar(100),@id)        end    else        begin         select @guid = newid()     exec('insert into ' + @tbname + '(' + @keyfield + ',' + @colname + ') select ''' + @guid + ''',0x')     set @filter = 'where ' + @keyfield + '=''' + convert(varchar(100),@guid) + ''''        end    end  else   begin    if @whereclause <> ''       set @filter =  'where ' + @whereclause    else       set @filter = 'where 1=1'   end else  begin   if @whereclause <> ''      set @filter = 'where ' +  @whereclause   else      set @filter = 'where 1=1'  end

SELECT @exec_str = 'textcopy ' + ' /U ' + @login + ' /P ' + @password + ' /D ' + @dbname + ' /T ' + @tbname + ' /C ' + @colname + ' /W "' + @filter + '" /F ' + @filename + ' /' + @direction

EXEC master..xp_cmdshell @exec_str

GO

 

二、如果執行sp_textcopy存儲過程時報textcopy不是可執行文件的話,你就到  C:\Program Files\Microsoft SQL Server\MSSQL\Binn 目錄下拷備     textcopy.exe到: C:\Program Files\Microsoft SQL Server\80\Tools\Binn

 

三、把要加文件到字段的表除主鍵外都設置可為空。

   如下表。ReportTable表除主鍵外其他字段均可為空。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ReportTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[SFPReport] GO

CREATE TABLE [dbo].[ReportTable] (  [ReportID] [uniqueidentifier] NOT NULL ,  [ReportName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,  [ReportTitle] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,  [ReportType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,  [ReportTemplateFile] [image] NULL ,  [ReportTemplateFileExtension] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,  [ReportGetDataMode] [text] COLLATE Chinese_PRC_CI_AS NULL ,  [ReportOrder] [float] NULL ,  [ReportRegionLevel] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO

 

四、執行下面語句導入文件

1.執行下面語句導入文件(生成一條記錄)  exec sp_textcopy 'sa','sa密碼','[數據庫a]','reporttable','reportid','ReportTemplateFile','c:\excel1122.xls','','I',0,1  參數意義見存儲過程定義。  暫時只能將文件插入到一條新紀錄中,如果是修改一條記錄的存放文件image字段,還報錯,暫時不行。

2.對該記錄修改除文件字段外的其他字段內容。

 

五、備份有文件字段的表(導出全部內容到一個文件中)

exec master..xp_cmdshell 'bcp  [數據庫a]..reporttable  out E:\emp.txt -w -U sa -P sa密碼' --將數據庫reporttable表t_emp導出到d:\emp.txt ,即是導出成txt文件

六、恢復有文件字段的表(導入表全部內容)

delete from 數據庫a..reporttable exec master..xp_cmdshell 'bcp  [數據庫a]..reporttable  in E:\emp.txt -w -U sa -P sa密碼' --將備份的數據庫a的reporttable表文件 t_emp.txt 導入到數據庫a的reporttable中。

 


免責聲明!

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



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