现在的位置: 首页 > 综合 > 正文

slq ntext,varchar,nvarchar转换

2013年12月02日 ⁄ 综合 ⁄ 共 4727字 ⁄ 字号 评论关闭
Sql Server 中 text或ntext,varchar,nvarchar 字段内容替换方法总结
2009-10-20 18:18
CREATE procedure [dbo].[Proc_UpdateNTextField]  

@TargetTable   nvarchar(1000), --目标表名  

@TargetField   nvarchar(1000), --目标字段名  

@PKField       nvarchar(1000), --该表主键字段名  

@otxt   nvarchar(1000),       --需要替换的字符串  

@ntxt   nvarchar(1000)        --替换后的字符串  

as

begin  

declare @SqlStr nvarchar(4000)  

set @SqlStr = ' declare @txtlen int '

set @SqlStr = @SqlStr + ' set @txtlen = len(''' + @otxt + ''') '

set @SqlStr = @SqlStr + ' declare @pos int '

set @SqlStr = @SqlStr + ' set @pos = 0 '

set @SqlStr = @SqlStr + 'declare   curs   cursor   local   fast_forward for select '

set @SqlStr = @SqlStr + @PKField + ' , textptr(' + @TargetField +')
from ' +   @TargetTable +'    where ' + @TargetField + ' like   
''%'   +   @otxt   +'%'''     

set @SqlStr = @SqlStr + ' declare   @ptr   binary(16) '      

set @SqlStr = @SqlStr + ' declare   @id   char(32) '     

    

set @SqlStr = @SqlStr + ' open   curs '   

    

set @SqlStr = @SqlStr + ' fetch   next   from   curs   into   @id,   @ptr '   

    

set @SqlStr = @SqlStr + ' while   @@fetch_status   =   0 '   

set @SqlStr = @SqlStr + ' begin '    

set @SqlStr = @SqlStr + ' select @pos= patindex(''%' + @otxt + '%'',ProductDesc) from ProductTemp where ProductID=@id

'

set @SqlStr = @SqlStr + ' while @pos>0 '

set @SqlStr = @SqlStr + ' begin '

set @SqlStr = @SqlStr + ' set @pos=@pos-1 '

set @SqlStr = @SqlStr + ' updatetext ' + @TargetTable + '.' +@TargetField

+ '   @ptr   @pos   @txtlen   ''' + @ntxt + ''' '

set @SqlStr = @SqlStr + ' select @pos= patindex(''%' + @otxt + '%'',ProductDesc) from ProductTemp where ProductID=@id

'

    

set @SqlStr = @SqlStr + ' end '

    

set @SqlStr = @SqlStr + ' fetch   next   from   curs   into   @id,   @ptr '   

   

set @SqlStr = @SqlStr + ' end '    

    

set @SqlStr = @SqlStr + ' close   curs '    

set @SqlStr = @SqlStr + ' deallocate   curs '

EXECUTE sp_executesql @SqlStr  

end

----有错,未修改

 

转载

Sql Server 中 text或ntext 字段内容替换方法总结


update

表名

    set

text类型字段名=

replace

(

convert

(

varchar

(

8000)

,

text类型字段名)

,

'要替换的字符'

,

'替换成的值'

)

1.update ntext:

(1)varchar和nvarchar类型是支持replace,所以如果你的text/ntext不超过8000/4000可以先转换成前面两种类型再使用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 =

'<requested_amount+1>'

--要替换成的值

   set

@

len=

len(

@

des)

   set

@

str=

'<requested_amount>'

--要替换的字符

   set

@

count

=

0

--统计次数.

    WHILE 1=

1

   BEGIN

       select

@

pos=

patINDEX(

'%'

+

@

des+

'%'

,

字段名)

-

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 列.

以下提供一个修改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

以上通过新增一列替换旧的列方法实现了将一个不允许为空的ntext修改为允许为空的ntext列(注意:以上的go不能缺少).修改表结构之后,由于视
图所依赖的基础对象的更改,视图的持久元数据会过期,需要刷新视图,通过sp_refreshview (可以通过sp_depends
找处相关的视图,再通过sp_refreshview逐个刷新).

另外可以也可以通过一下存储过程进行刷新所有视图:

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

 

 

varchar,nvarchar 替换方法

 

CREATE procedure [dbo].[Proc_UpdateNVarcharField]

as

declare @delStr nvarchar(500)

set @delStr='http://localhost/' --要被替换掉字符

/**********以下为操作实体************/

set nocount on

declare @tableName nvarchar(100),@columnName nvarchar(100),@tbID int,@iRow int,@iResult int

declare @sql nvarchar(500)

set @iResult=0

declare cur cursor for

select name,id from sysobjects where xtype='U'

open cur

fetch next from cur into @tableName,@tbID

while @@fetch_status=0

begin

declare cur1 cursor for

        --xtype in (231,167,239,175) 为char,varchar,nchar,nvarchar类型

        select name from syscolumns where xtype in (231,167,239,175) and id=@tbID

open cur1

fetch next from cur1 into @columnName

while @@fetch_status=0

begin

      set @sql='update [' + @tableName + '] set ['+ @columnName +']=
replace(['+@columnName+'],'''+@delStr+''',''/'') where ['+@columnName+']
like ''%'+@delStr+'%'''

     

      exec sp_executesql @sql     

      set @iRow=@@rowcount

      set @iResult=@iResult+@iRow

      if @iRow>0

      begin

    print '表:'+@tableName+'

,列:'+@columnName+'被更新'+convert(varchar(10),@iRow)+'条记录;'

      end     

      fetch next from cur1 into @columnName

end

close cur1

deallocate cur1

fetch next from cur into @tableName,@tbID

end

print '数据库共有'+convert(varchar(10),@iResult)+'条记录被更新!!!'

close cur

deallocate cur

set nocount off

抱歉!评论已关闭.