ASE中对于大文本字段的使用方法
ASE中对 text、image 和 unitext 列的限制
不能在以下情况中使用 text、image 或 unitext 列:
- 用作存储过程的参数或传递给这些参数的值
- 作为局部变量
- 在 order by clause、compute clause、group by 和 union 子句中
- 用于索引
- 用于子查询或连接
- 在 where 子句中,除非带有关键字 like
- 同 + 并置运算符一起使用
建立测试数据:
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.