zoukankan      html  css  js  c++  java
  • ms sql 替换字段中的部分字

    ---------------转载,是为了自己方便,谢谢提供者
    适用于MS

    1。varchar和nvarchar类型是支持replace,所以如果你的text不超过8000可以先转换成前面两种类型再使用replace。
    update 表名
    set 字段名=replace(convert(varchar(8000),字段名),'要替换的字符','替换成的值')
    2。如果你的text大于8000,可以用下面的方法:
    --测试数据
    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
    上面说的是针对ntext字段的替换处理,如果要处理text字段,只需要先转换成ntext字段然后保存在临时表里面,处理完以后再从临时表写回text就行了。
    其实一般象text,ntext字段这些都是抓到程序里面去处理的。

  • 相关阅读:
    SQL2005 SQL2008 远程连接配置方法
    Subvision 安装 部署 TortoiseSVN
    在wpf或winform关闭子窗口或对子窗口进行某个操作后刷新父窗口
    C# 中的委托和事件
    长数字隔三位用逗号","隔开,保留两位小数,指定长度,不足补空格
    C# 柱状图, 折线图, 扇形图
    如何在Visual Studio 2010旗舰版本下安装Window Phone 7 简体中文开发环境
    vs2010发布、打包安装程序(超全超详细)
    java 环境搭建
    SQL2008 转 2000(高版本转换到低版本)
  • 原文地址:https://www.cnblogs.com/liwenqiang/p/1787693.html
Copyright © 2011-2022 走看看