[摘]sqlserver中怎么对text、ntext和image操作

  下面的函数和语句可以与   ntext、text   或   image   数据一起使用。  
  函数                           语句    
  DATALENGTH         READTEXT    
  PATINDEX             SET   TEXTSIZE    
  SUBSTRING           UPDATETEXT    
  TEXTPTR               WRITETEXT    
  TEXTVALID    
   
  主题:text字段  
  1:替换  
   
  --创建数据测试环境  
  create   table   #tb(aa   text)  
  insert   into   #tb   select   'abc123abc123,asd'  
   
  --定义替换的字符串  
  declare   @s_str   varchar(8000),@d_str   varchar(8000)  
  select   @s_str='123'   --要替换的字符串  
  ,@d_str='000' --替换成的字符串  
   
  --字符串替换处理  
  declare   @p   varbinary(16),@postion   int,@rplen   int  
  select   @p=textptr(aa),@rplen=len(@s_str),@postion=charindex(@s_str,aa)-1   from   #tb  
  while   @postion>0  
  begin  
  updatetext   #tb.aa   @p   @postion   @rplen   @d_str  
  select   @postion=charindex(@s_str,aa)-1   from   #tb  
  end  
   
  --显示结果  
  select   *   from   #tb  
   
  --删除数据测试环境  
  drop   table   #tb

---------------------------------------------------------------  
   
  /****************全部替换************************/  
  DECLARE   @ptrval   binary(16)  
  SELECT   @ptrval   =   TEXTPTR(aa)     FROM     #tb     WHERE   aa   like   '%数据2%'  
  if   @ptrval   is   not   null                 --   一定要加上此句,否则若找不到数据下一句就会报错  
  UPDATETEXT   #tb.aa   @ptrval   0   null   '数据3'  
   
  /****************在字段尾添加**********************************/  
  --定义添加的的字符串  
  declare   @s_str   varchar(8000)  
  select   @s_str='*C'   --要添加的字符串  
  --字符串添加处理  
  declare   @p   varbinary(16),@postion   int,@rplen   int  
  select   @p=textptr(detail)   from   test   where   id='001'  
  updatetext   test.detail   @p   null   null   @s_str  
   
  总结:  
  1:Text字段类型不能直接用replace函数来替换,必须用updatetext  
  2:字段比较不能用 where   字段   =   ‘某数据’,可以用like来代替  
  3:updatetext时,若@ptrval值为空会出错,需注意。

 

READTEXT  
  读取   text、ntext   或   image   列中的   text、ntext   或   image   值,从指定的偏移量开始读取指定的字节数。  
   
  语法  
  READTEXT   {   table.column   text_ptr   offset   size   }   [   HOLDLOCK   ]    
   
  参数  
  table.column  
   
  是从中读取的表和列的名称。表名和列名必须符合标识符的规则。必须指定表名和列名,不过可以选择是否指定数据库名称和所有者名称。  
   
  text_ptr  
   
  有效文本指针。text_ptr   必须是   binary(16)。  
   
  offset  
   
  开始读取   text、image   或   ntext   数据之前跳过的字节数(使用   text   或   image   数据类型时)或字符数(使用   ntext   数据类型时)。使用   ntext   数据类型时,offset   是在开始读取数据前跳过的字符数。使用   text   或   image   数据类型时,offset   是在开始读取数据前跳过的字节数。    
   
  size  
   
  是要读取数据的字节数(使用   text   或   image   数据类型时)或字符数(使用   ntext   数据类型时)。如果   size   是   0,则表示读取了   4   KB   字节的数据。  
   
  HOLDLOCK  
   
  使文本值一直锁定到事务结束。其他用户可以读取该值,但是不能对其进行修改。  
   
  注释  
  使用   TEXTPTR   函数获得有效的   text_ptr   值。如果返回不止一行,TEXTPTR   将返回指向指定行中的   text、ntext   或   image   列的指针,或返回指向查询所返回的最后一行中的   text、ntext   或   image   列的指针。由于   TEXTPTR   返回   16   字节的二进制字符串,所以最好声明一个控制文本指针的局部变量,然后在   READTEXT   中使用该变量。有关声明局部变量的更多信息,请参见   DECLARE   @local_variable。    
   
  示例  
  下例读取   pub_info   表中   pr_info   列的第   2   个至第   26   个字符。  
   
  USE   pubs  
  GO  
  DECLARE   @ptrval   varbinary(16)  
  SELECT   @ptrval   =   TEXTPTR(pr_info)    
        FROM   pub_info   pr   INNER   JOIN   publishers   p  
              ON   pr.pub_id   =   p.pub_id    
              AND   p.pub_name   =   'New   Moon   Books'  
  READTEXT   pub_info.pr_info   @ptrval   1   25  
  GO

 WR99vETEXT
允许对现有的 text、ntext 或 image 列进行无日志记录的交互式更新。该语句将彻底重写受其影响的列中的任何现有数据。WR99vETEXT 语句不能用在视图中的 text、ntext 和 image 列上。

UPDATETEXT
更新现有 text、ntext 或 image 字段。使用 UPDATETEXT 在适当的位置更改 text、ntext 或 image 列的一部分。使用 WR99vETEXT 来更新和替换整个 text、ntext 或 image 字段。

示例
本示例把文本指针置于局部变量 @ptrval 中,然后使用 UPDATETEXT 更新拼写错误。

USE pubs
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'true'
GO
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(pr_info)
FROM pub_info pr, publishers p
WHERE p.pub_id = pr.pub_id
AND p.pub_name = 'New Moon Books'
UPDATETEXT pub_info.pr_info @ptrval 88 1 'b'
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'false'
GO

返回特定文本数据
下例在 pubs 数据库的 pub_info 表中查找与 pub_id 0736 相关联的 text 列 (pr_info)。下例首先声明一个局部变量 @val。然后将文本指针(长二进制字符串)置于 @val 中,并将其作为参数提供给 READTEXT 语句,该语句将返回从第五个字节(偏移量为 4)开始的 10 个字节。

USE pubs
GO
DECLARE @val varbinary(16)
SELECT @val = TEXTPTR(pr_info)
FROM pub_info
WHERE pub_id = '0736'
READTEXT pub_info.pr_info @val 4 10
GO

// 保存可執行文件到COMMON數據庫
long ll_filenum, ll_len, ll_ret
blob lblb_c, lblb_total
boolean lb_auto

lb_auto = gnv_app.inv_sec.autocommit
gnv_app.inv_sec.autoco

mmit = true
If not fileexists(as_file) Then RETURN FAILURE

 

ll_filenum = fileopen(as_file, StreamMode!, Read!, Shared!)
ll_len = fileread(ll_filenum, lblb_c)
do while ll_len > 0
lblb_total = lblb_total + lblb_c
ll_len = fileread(ll_filenum, lblb_c)
loop

fileclose(ll_filenum)
updateblob app_files set content = :lblb_total where id = :al_id using gnv_app.inv_sec;
ll_ret = gnv_app.inv_sec.SQLNRows
gnv_app.inv_sec.autocommit = lb_auto
If ll_Ret <= 0 Then RETURN FAILURE

RETURN SUCCESS

long ll_max, i
integer li_FileNum

If len(ablb_data) = 0 Then return 0

li_FileNum = FileOpen(as_file, StreamMode!, Write!, LockReadWrite!, Replace!)
ll_max = len(ablb_data)

i = 0
do while ll_max > 0
FileWrite(li_FileNum, blobmid(ablb_data, i * 32765 + 1, 32765))
ll_max = ll_max - 32765
i ++
Loop

fileclose(li_filenum)

RETURN 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值