在 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%'
我收到此错误:
我可以用 T-SQL 解决这个问题吗?有人有如何阅读和循环的示例吗? 由于这是一次性转换,也许我可以更改为另一种类型,但我担心我会弄乱数据。消息 8116,第 16 级,状态 1,第 1 行 参数数据类型 ntext 对于替换函数的参数 1 无效。
有一个主键字段:名称: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 无效”的解决方案及原理分析扩展