加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:03:28 所属栏目:MsSql教程 来源:网络整理
导读:? 下面的函数和语句可以与 ? ntext、text ? 或 ? image ? 数据一起使用。 ? ? 函数 ? ? ? ? ? ? ? ? ? ?????? ?语句 ? ? ? DATALENGTH ? ? ? ? READTEXT ? ? ? PATINDEX ? ? ? ? ? ? SET ? TEXTSIZE ? ? ? SUBSTRING ? ? ? ? ? UPDATETEXT ? ? ? TEXTPTR ? ?

? 下面的函数和语句可以与 ? 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),@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','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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读