基于WHERE子句的SQL字符串替换

基于WHERE子句的SQL字符串替换,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有一个memo字段,其中可能包含&和HTML等价物&。我需要编写一个脚本,以确保所有的ampersand实例都是HTML等效的。使用下面的脚本,但WHERE子句似乎没有考虑备注字段中的单个实例(字符串),而是整个字段。。。关于如何实现这一点有什么想法吗?谢谢 UPDATE STOCKMEM SET INETFDESC = CAST(REPLACE(CAST(INETFDESC as NVarchar(MAX)),'&','&') AS NText

我有一个memo字段,其中可能包含&和HTML等价物&。我需要编写一个脚本,以确保所有的ampersand实例都是HTML等效的。使用下面的脚本,但WHERE子句似乎没有考虑备注字段中的单个实例(字符串),而是整个字段。。。关于如何实现这一点有什么想法吗?谢谢

 UPDATE 
    STOCKMEM
 SET 
    INETFDESC = CAST(REPLACE(CAST(INETFDESC as NVarchar(MAX)),'&','&') AS NText)
 WHERE 
    INETFDESC LIKE '%&%' 
    AND INETFDESC NOT LIKE '%&%'
请尝试以下方法:

 UPDATE STOCKMEM
 SET INETFDESC = CAST(
                      REPLACE(
                              REPLACE(
                                      CAST(INETFDESC as NVarchar(MAX))
                              ,'&','&')
                      , '&', ,'&')AS NText)
 WHERE INETFDESC LIKE '%&[^amp;]%' 
第一次更换将更改
&
&
,第二个将替换所有
&
回到
&

顺便说一句,请注意,
NText
数据类型为,您应该将其转换为
nvarchar(max)
。 从MSDN:

重要ntexttextimage数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max)varchar(max)varbinary(max)

请尝试以下方法:

 UPDATE STOCKMEM
 SET INETFDESC = CAST(
                      REPLACE(
                              REPLACE(
                                      CAST(INETFDESC as NVarchar(MAX))
                              ,'&','&')
                      , '&', ,'&')AS NText)
 WHERE INETFDESC LIKE '%&[^amp;]%' 
第一次更换将更改
&
&
,第二个将替换所有
&
回到
&

顺便说一句,请注意,
NText
数据类型为,您应该将其转换为
nvarchar(max)
。 从MSDN:

重要ntexttextimage数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max)varchar(max)varbinary(max)


您可以通过以下方式完成相同的任务:

 UPDATE STOCKMEM
 SET INETFDESC = CONVERT(NVARCHAR(MAX),(REPLACE(REPLACE(INETFDESC, '&', '&'), '&', '&')))
WHERE INETFDESC LIKE '%&%'

您可以通过以下方式完成相同的任务:

 UPDATE STOCKMEM
 SET INETFDESC = CONVERT(NVARCHAR(MAX),(REPLACE(REPLACE(INETFDESC, '&', '&'), '&', '&')))
WHERE INETFDESC LIKE '%&%'

您所说的“WHERE
子句似乎没有考虑到
&
的各个实例”是什么意思?您可以显示一些示例数据吗?因为有数十万行,这是一个备注字段,所以您的where进程只包含需要更新的字符串。。。因此,只有以“amp;”开头的实例才有帮助吗?您所说的“where
子句似乎没有考虑到
&
的各个实例”是什么意思?您可以显示一些示例数据吗?因为有数十万行,这是一个备注字段,所以您的where进程只包含需要更新的字符串。。。所以,只有通过“amp;”进行处理的情况才有帮助吗?太好了,谢谢Zohar!使用WHERE-LIKE处理所有的&,而不仅仅是那个些需要更新的实例,通过调整它是否可以提高效率?此备注字段有数十万行。谢谢。谢谢Zohar,期待你的反馈。我已经编辑了我的答案。现在where子句不会选择只有
&;的列
Zohar,这太完美了——非常感谢您分享您的专业知识。Zohar,大家好,我们再次遇到了一个问题,可能还有其他以“&”(即—“等)开头的特殊HTML字符…所以我们需要确保我们不会将它们转换为&;否则我们最终会将—转换为&;mdash;…也就是说,最长的HTML标记可以以六个字符开头,所以&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&以“;“在&?谢谢一堆。太好了,谢谢你Zohar!使用WHERE LIKE处理所有的&,而不仅仅是那些需要更新的实例,通过调整它可以提高效率吗?此备注字段有数十万行。谢谢。谢谢你Zohar,期待你的反馈。我已经编辑了我的回答。现在where子句不会选择只有
&;
Zohar的列,这太完美了——非常感谢您分享您的专业知识。Zohar,您好,我们再次遇到一个问题,可能会有其他以“&”(即—)开头的特殊HTML字符。。。因此,我们需要确保不会将这些转换为&;否则,我们最终会转换为—至&;mdash。。。也就是说,以&开头的最长的HTML标记似乎是六个字符,所以&u_; _; ; ;。。。您对更新where子句有什么想法,这样它就不会更新在&后1-7个字符中以“;”开头的任何&?非常感谢。