将文件导入到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中。

上一篇:iOS开发Hessian


下一篇:redis的lua使用(EVALSHA)