ntext字段替换

3.7 . 5 ntext字段的REPLACE处理示例.sql

-- 测试数据
CREATE TABLE tb(col ntext )
INSERT tb VALUES ( REPLICATE ( ' 0001,0002,0003,0004,0005,0006,0007,0008,0009,0100, '
   
+ ' 220000001,302000004,500200006,700002008,900002120, ' , 800 ))
DECLARE @p binary ( 16 )
SELECT @p = TEXTPTR (col) FROM tb
UPDATETEXT tb.col @p NULL 0 tb.col @p
GO

-- 替换处理定义
DECLARE @s_str nvarchar ( 1000 ), @r_str nvarchar ( 1000 )
SELECT @s_str = ' 00 '   -- 要替换的字符串
    , @r_str = ' 0000 '   -- 替换成该字符串

DECLARE @p varbinary ( 16 )
DECLARE @start int , @s nvarchar ( 4000 ), @len int
DECLARE @s_len int , @step int , @last_repl int , @pos int

-- 替换处理参数设置
SELECT
   
-- 用于要判断每次截取数据,最后一个被替换数据位置的处理
    @s_len = LEN ( @s_str ),

   
-- 设置每次应该截取的数据的长度,防止REPLACE后数据溢出
    @step = CASE WHEN LEN ( @r_str ) > LEN ( @s_str )
       
THEN 4000 / LEN ( @r_str ) * LEN ( @s_str )
       
ELSE 4000 END

-- 替换处理的开始位置
SELECT @start = PATINDEX ( ' % ' + @s_str + ' % ' ,col),
   
@p = TEXTPTR (col),
   
@s = SUBSTRING (col, @start , @step ),
   
@len = LEN ( @s ),
   
@last_repl = 0
FROM tb
WHERE PATINDEX ( ' % ' + @s_str + ' % ' ,col) > 0
   
AND TEXTVALID ( ' tb.col ' , TEXTPTR (col)) = 1
WHILE @len >= @s_len
BEGIN
   
-- 得到最后一个被替换数据的位置
    WHILE CHARINDEX ( @s_str , @s , @last_repl ) > 0
       
SET @last_repl = @s_len
           
+ CHARINDEX ( @s_str , @s , @last_repl )

   
-- 如果需要,更新数据,同时判断下一个取数位置的偏移量
    IF @last_repl = 0
       
SET @last_repl = @s_len
   
ELSE
   
BEGIN
       
SELECT @last_repl = CASE
           
WHEN @len < @last_repl THEN 1
           
WHEN @len - @last_repl >= @s_len THEN @s_len
           
ELSE @len - @last_repl + 2 END ,
           
@s = REPLACE ( @s , @s_str , @r_str ),
           
@pos = @start - 1
       
UPDATETEXT TB.col @p @pos @len @s
   
END
   
-- 获取下一个要处理的数据
    SELECT @start = @start + LEN ( @s ) - @last_repl + 1 ,
       
@s = SUBSTRING (col, @start , @step ),
       
@len = LEN ( @s ),
       
@last_repl = 0
   
FROM tb
END
GO

-- 显示处理结果
SELECT datalength (col), * FROM tb
DROP TABLE tb

转载于:https://www.cnblogs.com/hqbird/archive/2009/02/12/1389197.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值