SQL Server2005 批处理形式导出数据形成JPEG文件

一、背景:

    某客户数据库中有一个数据表用于保存历史图片,截止到目前为止已经累计保存了上千万张图片.由于前台软件进行调整,获取图片方式改从硬盘上获取,因此需要将这些原保存在数据表的图片批量导出到本地硬盘,并符合约定的命名规则。

    曾想到过的方案:

1. 写个小程序,连接到数据库中,一条条记录读取,然后以Stream形式保存到本地;考虑到用这种方法还要写代码,不爽!而且也效率也不高;

2. 利用sql server 自带bcp命令进行导出。但由于不了解bcp用法,结果走了点弯路,最后终于实现如下解决方法,个人感觉比较好,因此放出来,供大家参考!

  

另外请教问题:如何对指定目录下所有的jpg文件进行判断,判断其是否为是有效的jpg文件(即可以正常显示出内容),有没有类似的工具,最好是以命令行形式提供。

二、解决方案:

/* ============================================================================================
   作用:利用SQL 自带bcp命令以批处理方式将指定数据表中image字段的内容导出到本地硬盘文件中
   作者:王洪生 gis_gps#126.com
   日期:2009.08.12
   使用
   1. 将此脚本保存到文件,如ExoprtImg.sql;
   2.在Dos命令提示符下输入: sqlcmd -S服务器 -U"用户名"  -P"密码" -d"数据库" -i ExportImg.sql -v starttime="'2009-08-01 00:00:00'" endtime="'2009-08-10 00:00:00'"
   3.静静等待文件数据表中的照片被导出到本地硬盘吧!
   说明
   在导出image类型字段内容时,由于image被导出形成的文件,会在文件头前加上4个字节。这样会使导出的图片不能正常显示。解决这一问题:你需要首先建立一个文件格式。具体操作:

    Run cmd
    bcp "select top 1 ImgData from MyImage" queryout "c:\test.jpg" -S[SERVERNAME] -U****** -p*******
    Enter the file storage type of field img [nvarchar]:  {enter}
    Enter prefix-length of field img [4]: 0
    Enter length of field img [0]: {enter}
    Enter field terminator [none]: {enter}
    Do you want to save this format information in a file? [Y/n] y
    Host filename [bcp.fmt]: MyImage.fmt 
============================================================================================== */
declare @sFileName varchar(100)
declare @sObjectID varchar(5)
declare @id int
declare @sDate varchar(8)
declare @sTime varchar(30)
declare @SQLcommand nvarchar(4000)
declare @StartTime varchar(24)
declare @EndTime varchar(24)
declare @iCount int
set @iCount = 0
set @StartTime = $(starttime)
set @EndTime = $(endtime)
print N'---------------------------------------------------------------------'
print '现在开始导出:' + @StartTime + '至' + @EndTime + '期间的图片,请稍等....'
declare mycur cursor for select ObjectID,convert(varchar,CreateTime,112) as sDate,
convert(varchar,CreateTime,108) as sTime,id from a_mdtpictureinfo
where createtime between @StartTime and @EndTime
open mycur
fetch next from mycur into @sObjectID,@sDate,@sTime,@id
while @@fetch_status = 0
begin
  set @iCount = @iCount + 1
  set @sFileName = @sObjectID + '_' +substring(@sDate,3,6) + replace(@sTime,':','') +'.jpg'
  --print @sFileName
  --print '.'
  set @SQLcommand = 'bcp "select photo from gpsdb_new.dbo.a_mdtpictureinfo where id =' +convert(varchar,@id) + '" queryout "d:\test\' + @sFileName + '" -T -N -f d:\myimages.fmt'
  --print @SQLcommand
  exec xp_cmdshell @SQLcommand no_output
  fetch next from mycur into @sObjectID,@sDate,@sTime,@id
end
close mycur
deallocate mycur
print N'累计导出:' + str(@iCount) + '张照片!'
print N'---------------------------------------------------------------------'

posted @ 2009-08-13 02:06  守护心中彩虹  阅读(547)  评论(0编辑  收藏  举报