28.ntext字段的replace处理案例

SQL Server 语句实现 同时被 2 个专栏收录
295 篇文章 1 订阅
--测试数据
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
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

huang714

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值