在 text 或 ntext 数据类型上替代 REPLACE

Posted

技术标签:

【中文标题】在 text 或 ntext 数据类型上替代 REPLACE【英文标题】:alternatives to REPLACE on a text or ntext datatype 【发布时间】:2011-05-19 12:03:54 【问题描述】:

我需要更新/替换 datatable.column 中的数据。该表有一个名为Content 的字段。我正在使用REPLACE 函数。由于列数据类型为NTEXT,SQL Server 不允许我使用REPLACE 函数。

我无法更改数据类型,因为此数据库是第 3 方软件表。更改数据类型将导致应用程序失败。

UPDATE [CMS_DB_test].[dbo].[cms_htmlText] 
SET Content = REPLACE(Content,'ABC','DEF') 
WHERE Content LIKE '%ABC%' 

我收到此错误:

消息 8116,第 16 级,状态 1,第 1 行 参数数据类型 ntext 对于替换函数的参数 1 无效。

我可以用 T-SQL 解决这个问题吗?有人有如何阅读和循环的示例吗? 由于这是一次性转换,也许我可以更改为另一种类型,但我担心我会弄乱数据。

有一个主键字段:名称:ID - 整数 - 这是一个身份......所以我也需要考虑这个问题。也许将 Identity 临时设置为 N。

请指教如何实现REPLACE功能?

大约。需要用新的解决方案更新 3000 条语句。

【问题讨论】:

这是 SQL Server 2000 吗? 回答:我正在使用 SQL2008... 并且 DATABASE 的兼容级别为 2000 (80)。如果我在 2008 年也改变它,它会起作用吗?因为我不知道后果,所以我离开了兼容级别 2000,但它是 SQL 2008 数据库。这是一次转换... 【参考方案1】:

如果您的数据不会溢出 4000 个字符并且您使用的是 SQL Server 2000 或兼容级别 8 或 SQL Server 2000:

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = CAST(REPLACE(CAST(Content as NVarchar(4000)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%' 

对于 SQL Server 2005+:

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = CAST(REPLACE(CAST(Content as NVarchar(MAX)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%' 

【讨论】:

问个简单的问题,NText 的第二次演员真的有必要吗?我认为将NVarchar(MAX) 分配给NText 会自动转换它。 非常简单的修复。请注意,2005+ nvarchar(max) 没有 4000 字符限制。我知道这很明显(现在,对我来说),但我第一次读它时好像两个答案都有这个限制。【参考方案2】:

假设 SQL Server 2000,以下*** question 应该可以解决您的问题。

如果使用 SQL Server 2005/2008,可以使用以下代码(取自here):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable

【讨论】:

以上是关于在 text 或 ntext 数据类型上替代 REPLACE的主要内容,如果未能解决你的问题,请参考以下文章

delphi程序中使用union all 查询sql数据中的两个表报"不能比较或排序 text、ntext和image类型"的错误。

Sqlserver 报错“参数数据类型 ntext/text 对于 replace 函数的参数 1 无效”的解决方案及原理分析扩展

sql server哪个字段类型可以保存最长文字

.SQL Server中 image类型数据的比较

charvarchar和nvarchar的区别

SQL中如何存储回车符和换行符,在text或者是ntext的数据类型中