ASE中对于大文本字段的使用方法

ASE中对 text、image 和 unitext 列的限制
不能在以下情况中使用 text、image 或 unitext 列:

  1.   用作存储过程的参数或传递给这些参数的值
  2.   作为局部变量
  3.   在 order by clause、compute clause、group by 和 union 子句中
  4.   用于索引
  5.   用于子查询或连接
  6.   在 where 子句中,除非带有关键字 like
  7.   同 + 并置运算符一起使用

建立测试数据:
create table test_lob(id int not null,notes text null)
go
insert into test_lob values(1,replicate('x',1024))
go
insert into test_lob values(2,replicate('y',16384))
go
如果想造text类型字段的数据的话,因为ASE中字符串函数、变量等受限于16384,可以先bcp导出,编辑后再导入。

查看text类型字段的长度,使用函数: datalength 。
select id,datalength(notes) from test_lob
go

一、如果text类型字段的长度小于16384字节的话,建议使用convert将text类型转化为varchar,然后再对字符串进行处理。
比如:提取text字段每行数据的前1000字节
declare @len int
select @len=1000
select substring(convert(varchar(16384),notes) ,1 ,@len) from test_lob
go

 二、如果text类型字段的长度大于16384字节的话,建议使用textptr、readtext等命令来处理text类型字段。
对于text类型字段,先使用textptr返回16字节的指针,然后用readtext读取该指针的响应内容。
readtext命令第一个参数为text类型字段名,第二个字节为16字节的指针,第三个字段为偏移量(第一个字符的偏移为0),第四个字节为想要提取的字符长度。
使用函数textvalid判断LOB列的指针是否有效? select textvalid("test_lob.notes",textptr(notes)) from test_lob

declare @val binary(16),@len int
select @len=datalength(notes),@val=textptr(notes) from test_lob where id = 2
readtext test_lob.notes @val 0 @len
go

注意:在使用readtext读取text类型字段的时候,能够显示的内容的最大长度受限于@@textsize,该全局变量默认值为:32768。查看当前textsize的值,使用:select @@textsize
在当前会话中设置textsize,使用: set textsize 1000000
可以在数据库连接串中设置textsize选项。

三、循环读取text类型字段的值
例如:每次读取500字节,

declare @val binary(16),@len int
declare @i int,@loop_times int,@offset int,@get_len int
--each time get 500 chars
select @get_len=500
select @len=datalength(notes),@val=textptr(notes) from test_lob where id = 1
select @loop_times=ceiling(1.0*@len/@get_len),@i=0,@offset=0
if @len < @get_len select @get_len = @len
while (@i < @loop_times)
begin
  readtext test_lob.notes @val @offset @get_len
  select @i=@i+1
  select @offset=@i*500
  if (@i = @loop_times - 1) select @get_len=@len-@i*500
end
go

对于substring函数,如果想要获取的长度大于当前内容长度,则提取所有字符。
readtext的最后一个参数必须保证offset+length小于或等于text字段最大长度。否则,报:
Msg 7124, Level 16, State 1:
The offset and length specified in the READTEXT command is greater than the actual data length of 1024.

  • 本文链接地址:http://www.dbainfo.net/ase-lob-text-image-usage.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《ASE中对于大文本字段的使用方法》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)