CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

如何写一个存储过程转换Image类型字段的内容????

楼主lgy2002(战士)2004-04-01 14:49:51 在 MS-SQL Server / 疑难问题 提问

表A中有一个字段XMLData,类型为Image.该字段保存的内容为XML流的片断。  
  现在要在存储过程里把改字段的内容转换为标准的XML文档输出,请问如何实现???????? 问题点数:100、回复次数:6Top

1 楼lgy2002(战士)回复于 2004-04-01 22:00:39 得分 0

怎么没有人回答我啊,希望斑竹帮帮忙。Top

2 楼zjcxc(邹建)回复于 2004-04-01 22:04:20 得分 100

这个在SQL中应该直接处理不了,将它导出到文件再处理吧Top

3 楼zjcxc(邹建)回复于 2004-04-01 22:04:42 得分 0

--导出成文件可以用:  
   
   
  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  
   
  goTop

4 楼lgy2002(战士)回复于 2004-04-01 22:40:59 得分 0

厉害,不过我明天才能试试。我现在用微软的Reporting   Service   做报表。Reporting   Service  
  不能在程序里做太多的处理。按照你的方法,我每次要先把数据导出来,然后在导入处理输出,不知道这样行不行,不过真的很感激。谢谢   zjcxc。Top

5 楼lgy2002(战士)回复于 2004-04-02 17:05:11 得分 0

To     zjcxc(邹建):  
      今天我试了,好像不行,测试如下:  
      首先建立表名A,字段XMLStream,类型   Image;表名B,字段XMLValue,类型   nvarchar(255).  
      写入数据(我用C#):  
  private   void   WriteData()  
  {  
          int   i_file_lenght   =   -1;  
   
          System.Web.HttpPostedFile   o_post_file   =   this.File1.PostedFile;  
   
          i_file_lenght                 =   o_post_file.ContentLength;  
          byte[]   FileByteArray   =   new   byte[i_file_lenght];  
          Stream   o_stream             =   o_post_file.InputStream;  
   
          o_stream.Read(FileByteArray,0,i_file_lenght);    
         
          String   SqlCmd   =   "INSERT   INTO   A(XMLStream)   VALUES   (@Image)";    
   
          System.Data.SqlClient.SqlParameter   sqlpar_image   =   new   System.Data.SqlClient.SqlParameter("@Image",System.Data.SqlDbType.Binary);  
          sqlpar_image.Value   =   FileByteArray;  
          this.sqlcomm.CommandText   =   SqlCmd;  
          this.sqlcomm.Parameters.Add(sqlpar_image);  
          try  
          {  
  this.sqlconn.Open();  
                  this.sqlcomm.ExecuteNonQuery();  
          }  
   
          catch   (   System.Data.SqlClient.SqlException   error)  
          {  
  this.Response.Write("<script>alert('"+error.ToString()+"')</script>");  
  this.sqlconn.Close();  
          }  
         
  }  
   
  接着我在查询分析器里执行下列操作:  
  EXEC   master..xp_cmdshell   'bcp   "select   top   10   XMLStream   from   master..A"   queryout   "c:\1.xml"   -n   '  
  delete     from   B  
  EXEC   master..xp_cmdshell   'bcp   master..B   in   "c:\1.xml"   -n   '  
  select   *   from   B  
  结果:  
  导出文件内容为:  
  D       <R   TABLE="CTRInfo"   A="U"><COL   CN="CTRNumber">CN003-C-00001</COL></R>  
  D       <R   TABLE="CTRInfo"   A="U"><COL   CN="CTRNumber">CN003-C-00001</COL></R>  
  。。。。。。。。。。。。。  
  D       <R   TABLE="CTRInfo"   A="U"><COL   CN="CTRNumber">CN003-C-00001</COL></R>  
   
  但是导入提示为:1   rows   copied.  
  另外输出空白数据!!!  
  如果我把B表的字段XMLValue改为Image   类型就可以全部导入。但输出就是16进制码。  
  请问我如何导出导入,才能输出<R   TABLE="CTRInfo"   A="U"><COL   CN="CTRNumber">CN003-C-00001</COL></R>...信息???  
     
  Top

6 楼lgy2002(战士)回复于 2004-04-06 11:07:44 得分 0

我已经搞定,用下列转化可以实现:  
  convert(varchar(2000),convert(varbinary(2000),dataimage))Top

相关问题

  • interbase的存储过程转换为MSSQL的存储过程.
  • 数据库Image字段赋值到byte[],再作为存储过程参数传回的问题
  • 请教转换sql存储过程
  • 关于表转换的存储过程
  • interbase的存储过程转换为MSSQL的存储过程第二个...
  • interbase的存储过程转换为MSSQL的存储过程最后一个了...
  • 用存储过程获取字段信息
  • 存储过程的困惑---如何输入变量字段
  • 想写一个存储blob字段的存储过程
  • 怎么用存储过程生成一个动态字段表???

关键词

  • 字段
  • 存储过程
  • 文件
  • 数据
  • 文档
  • 内容
  • 导出
  • 导入
  • binaryio
  • sqlpar

得分解答快速导航

  • 帖主:lgy2002
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo