一、在要執行的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中。