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