用查询语句或者存储过程能够把放在数据库里面的二进制图片另存下来吗?请帮忙!谢谢!

解决方案 »

  1.   

    存储过程调用bcp的. 邹老大有现成的,我就不写了,哈哈--bcp处理二进制文件参考   
        
        
        
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_binaryIO]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
      drop   procedure   [dbo].[p_binaryIO]   
      GO   
        
      /*--bcp   实现二进制文件的导入导出   
        
      支持image,text,ntext字段的导入/导出   
      image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等   
      text,ntext适合于文本数据文件   
        
      注意:导入不会新增记录,所以导入前要对表进行初始化,即插入记录   
      导入时,将覆盖满足条件的所有行   
      导出时,将把所有满足条件的行导出到指定文件中   
        
        
      此存储过程仅用bcp实现   
        
      --邹建   2003.08(引用请保留此信息)---*/   
        
      /*--调用示例   
      --数据导出   
      exec   p_binaryIO   'zj','','','acc_演示数据..tb','img','c:\zj1.dat'   
        
      --数据导入   
      exec   p_binaryIO   'zj','','','acc_演示数据..tb','img','c:\zj1.dat','',0   
      --*/   
      Create   proc   p_binaryIO   
      @servename   varchar   (30),--服务器名称   
      @username   varchar   (30),   --用户名   
      @password   varchar   (30),--密码   
      @tbname   varchar   (500),   --数据库..表名   
      @fdname   varchar   (30),   --字段名   
      @fname   varchar   (1000),--目录+文件名,处理过程中要使用/覆盖:@filename+_temp   
      @tj   varchar   (1000)='',   --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀   
      @isout   bit=1--1导出((默认),0导入   
      AS     
      declare   @fname_in   varchar(1000)--bcp处理应答文件名   
      ,@fsize   varchar(20)--要处理的文件的大小   
      ,@m_tbname   varchar(50)--临时表名   
      ,@sql   varchar(8000)   
        
      --则取得导入文件的大小   
      if   @isout=1     
      set   @fsize='0'   
      else   
      begin   
      create   table   #tb(可选名   varchar(20),大小   int   
      ,创建日期   varchar(10),创建时间   varchar(20)   
      ,上次写操作日期   varchar(10),上次写操作时间   varchar(20)   
      ,上次访问日期   varchar(10),上次访问时间   varchar(20),特性   int)   
      insert   into   #tb   
      exec   master..xp_getfiledetails   @fname   
      select   @fsize=大小   from   #tb   
      drop   table   #tb   
      if   @fsize   is   null   
      begin   
      print   '文件未找到'   
      return   
      end   
        
      end   
        
      --生成数据处理应答文件   
      set   @m_tbname='[##temp'+cast(newid()   as   varchar(40))+']'   
      set   @sql='select   *   into   '+@m_tbname+'   from(   
      select   null   as   类型   
      union   all   select   0   as   前缀   
      union   all   select   '+@fsize+'   as   长度   
      union   all   select   null   as   结束   
      union   all   select   null   as   格式   
      )   a'   
      exec(@sql)   
      select   @fname_in=@fname+'_temp'   
      ,@sql='bcp   "'+@m_tbname+'"   out   "'+@fname_in   
      +'"   /S"'+@servename   
      +case   when   isnull(@username,'')=''   then   ''     
      else   '"   /U"'+@username   end   
      +'"   /P"'+isnull(@password,'')+'"   /c'   
      exec   master..xp_cmdshell   @sql   
      --删除临时表   
      set   @sql='drop   table   '+@m_tbname   
      exec(@sql)   
        
      if   @isout=1   
      begin   
      set   @sql='bcp   "select   top   1   '+@fdname+'   from   '     
      +@tbname+case   isnull(@tj,'')   when   ''   then   ''   
      else   '   where   '+@tj   end   
      +'"   queryout   "'+@fname   
      +'"   /S"'+@servename   
      +case   when   isnull(@username,'')=''   then   ''     
      else   '"   /U"'+@username   end   
      +'"   /P"'+isnull(@password,'')   
      +'"   /i"'+@fname_in+'"'   
      exec   master..xp_cmdshell   @sql   
      end   
      else   
      begin   
      --为数据导入准备临时表   
      set   @sql='select   top   0   '+@fdname+'   into   '   
      +@m_tbname+'   from   '   +@tbname   
      exec(@sql)   
        
      --将数据导入到临时表   
      set   @sql='bcp   "'+@m_tbname+'"   in   "'+@fname   
      +'"   /S"'+@servename   
      +case   when   isnull(@username,'')=''   then   ''     
      else   '"   /U"'+@username   end   
      +'"   /P"'+isnull(@password,'')   
      +'"   /i"'+@fname_in+'"'   
      exec   master..xp_cmdshell   @sql   
        
      --将数据导入到正式表中   
      set   @sql='update   '+@tbname   
      +'   set   '+@fdname+'=b.'+@fdname   
      +'   from   '+@tbname+'   a,'   
      +@m_tbname+'   b'   
      +case   isnull(@tj,'')   when   ''   then   ''   
      else   '   where   '+@tj   end   
      exec(@sql)   
        
      --删除数据处理临时表   
      set   @sql='drop   table   '+@m_tbname   
      end   
        
      --删除数据处理应答文件   
      set   @sql='del   '+@fname_in   
      exec   master..xp_cmdshell   @sql   
      go
      

  2.   

    alter PROCEDURE sp_textcopy ( 
      @srvname    varchar (30), 
      @login      varchar (30), 
      @password    varchar (30), 
      @dbname      varchar (30), 
      @tbname      varchar (30), 
      @photoname    varchar (30), 
      @filename    varchar (30), 
      @whereclause varchar (40), 
      @direction  char(1)) 
    AS 
    DECLARE @exec_str varchar (255) 
    SELECT @exec_str = 
            'textcopy /S ' + @srvname + 
            ' /U ' + @login + 
            ' /P ' + @password + 
            ' /D ' + @dbname + 
            ' /T ' + @tbname + 
            ' /C ' + @photoname + 
            ' /W "' + @whereclause + 
            '" /F ' + @filename + 
            ' /' + @direction 
    EXEC master..xp_cmdshell @exec_str ,no_output create table photo(id int identity(1,1),photo image,memo nvarchar(50) default 'my photo')
    go
    insert photo(photo) values(0x)    -- 必须的,且不是null
    select * from photo
    --truncate table photosp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\myphoto\roy3.jpg','where id=5','I' --注意条件是 id=1
    3、读入
    sp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\photo\21.jpg','where id=1','I' --注意条件是 id=1sp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\photo\33.jpg','where id=2','I' --注意条件是 id=2go4、读出成文件
    sp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\roy.jpg','where id=1','O' --注意条件是 id=1
    sp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\roy1.jpg','where id=2','O'
    sp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\roy2.jpg','where id=3','O'
    sp_textcopy 'roy','sa','wuxi','test','photo','photo','E:\photo\roy3.jpg','where id=4','O'sp_textcopy 'roy','sa','wuxi','test','photo','photo','c:\bb.doc','where id=5','O' --注意条件是 id=2