0

我正在尝试遍历数据库中的每个varchar,nvarcharntext列,并replace使用@string.

但是,当该字段的最大长度仅为 50 时,它应该使用@shortstringonly 运行替换语句。就像下面的代码一样......

我到目前为止是这样的:

Declare @string varchar(100), @shortstring varchar(50)
Set @string = 'fullstring_100_characters'
Set @shortstring = 'shortstring_50_characters'

Update [Table] Set [Column] = Replace([Column],@string,'')

但是如果它是一个ntext语句看起来像这样,并且总是使用@string而不是@shortstring

Update [Table] Set [Column] = CAST(REPLACE(CAST([Column] as NVarchar(MAX)),@string,'') AS NText)

有人可以告诉我如何实现这一目标吗?

4

2 回答 2

0

为了更新 text 或 ntext 字段,您必须使用UPDATETEXT. 有关详细信息,请参阅以下链接:

更新 SQL Server 中的 text/ntext 或 varchar(max) 数据类型列

于 2012-08-01T13:58:55.830 回答
0

首先我得请你用 nvarchar(max) 替换你的 ntext 字段,ntext 很麻烦

来自微软的报价

"ntext、text 和 image 数据类型将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。使用 nvarchar(max)、varchar(max ) 和 varbinary(max) 代替。

用于存储大型非 Unicode 和 Unicode 字符串和二进制数据的固定和可变长度数据类型。Unicode 数据使用 UNICODE UCS-2 字符集。"引用结束

这是更改数据类型的方法:

alter table yourtable ALTER COLUMN colname varchar(max)

这是一个脚本,用于替换您在所有表格和列中描述的文本。如果 TABLE 中有一个计算列,脚本会发出一点声音,但它仍然会执行:

DECLARE @searchvalue varchar(100)
DECLARE @newvalue varchar(100)
DECLARE @newvalueShort varchar(50)
SET nocount off

SET @searchvalue = 'replace text'
SET @newvalue = 'new long text replacement'
SET @newvalueShort = 'short text'

SELECT * into #t FROM 
(
SELECT 'update [' + a.TABLE_name + '] 
SET ['+ column_name+ ']=replace(' +column_name +','''+@searchvalue +''','''+ case when character_maximum_length > 50 then @newvalue else @newvalueShort end + ''')
where [' +a.column_name+
'] like ''%'+@searchvalue +'%''' sqlstring
FROM INFORMATION_SCHEMA.COLUMNS a
join 
INFORMATION_SCHEMA.TABLES b
ON a.TABLE_name = b.TABLE_name
and b.TABLE_type = 'base TABLE'
WHERE data_type in ('varchar', 'char', 'nchar', 'nvarchar')
and character_maximum_length >= len(@newvalueShort)
) a

DECLARE @sqlstring as nvarchar(500)
DECLARE SqlCursor CURSOR FAST_FORWARD FOR
SELECT sqlstring FROM #t
OPEN SqlCursor
FETCH NEXT FROM SqlCursor
INTO @sqlstring
WHILE @@FETCH_STATUS = 0
BEGIN

     EXEC(@sqlstring)
     FETCH NEXT FROM SqlCursor
     INTO @sqlstring
END
CLOSE SqlCursor
DEALLOCATE SqlCursor
DROP TABLE #t
于 2012-08-01T14:27:12.227 回答