SQL Server中text或ntext 字段內(nèi)容替換方法

字號(hào):


    update 表名
    set text類型字段名=replace(convert(varchar(8000),text類型字段名),'要替換的字符','替換成的值')
    1.update ntext:
    (1)varchar和nvarchar類型是支持replace,所以如果你的text/ntext不超過8000/4000可以先轉(zhuǎn)換成前面兩種類型再使用replace。
    update 表名
    set text類型字段名=replace(convert(varchar(8000),text類型字段名),'要替換的字符','替換成的值')
    update 表名
    set ntext類型字段名=replace(convert(nvarchar(4000),ntext類型字段名),'要替換的字符','替換成的值')
    (2)如果text/ntext超過8000/4000,看如下例子
    declare @pos int
    declare @len int
    declare @str nvarchar(4000)
    declare @des nvarchar(4000)
    declare @count int
    set @des ='
    set @len=len(@des)
    set @str= ''--要替換的字符
    set @count=0--統(tǒng)計(jì)次數(shù).
    WHILE 1=1
    BEGIN
    select @pos=patINDEX() - 1
    from 表名
    where 條件
    IF @pos>=0
    begin
    DECLARE @ptrval binary(16)
    SELECT @ptrval = TEXTPTR(字段名)
    from 表名
    where 條件
    UPDATETEXT 表名.字段名 @ptrval @pos @len @str
    set @count=@count+1
    end
    ELSE
    break;
    END
    select @count
    2.alter column語句有局限性,比如不允許修改text、image、ntext 或 timestamp 列.
    以下提供一個(gè)修改ntext列的例子:
    Alter Table tbl Add newcol ntext null
    go
    update tbl set newcol=col
    go
    EXEC sp_rename 'tbl.col', 'oldcol', 'COLUMN'
    go
    EXEC sp_rename 'tbl.newcol', 'col', 'COLUMN'
    go
    alter table tbl drop column oldcol
    go
    以上通過新增一列替換舊的列方法實(shí)現(xiàn)了將一個(gè)不允許為空的ntext修改為允許為空的ntext列(注意:以上的go不能缺少).修改表結(jié)構(gòu)之后,由于視圖所依賴的基礎(chǔ)對(duì)象的更改,視圖的持久元數(shù)據(jù)會(huì)過期,需要刷新視圖,通過sp_refreshview (可以通過sp_depends 找處相關(guān)的視圖,再通過sp_refreshview逐個(gè)刷新).
    另外可以也可以通過一下存儲(chǔ)過程進(jìn)行刷新所有視圖:
    PRINT 'Refreshing all views...'
    DECLARE @vName sysname
    DECLARE refresh_cursor CURSOR FOR
    SELECT Name from sysobjects WHERE xtype = 'V'
    order by crdate
    FOR READ ONLY
    OPEN refresh_cursor
    FETCH NEXT FROM refresh_cursor
    INTO @vName
    WHILE @@FETCH_STATUS <> -1
    BEGIN
    exec sp_refreshview @vName
    PRINT '視圖' + @vName + ' refreshed'
    FETCH NEXT FROM refresh_cursor
    INTO @vName
    END
    CLOSE refresh_cursor
    DEALLOCATE refresh_cursor