SQL替换WHERE子句
我们有下面的查询,它是用来用HTML等价物(&)替换备注字段中的任何&的。在编写时,我们没有考虑到字段中可能还有其他HTML标记,这些标记也从“&”(即“等”)开始。.由于我们必须确保单独使用时所有的符号都是HTML等效的,而不是另一个标记的一部分,因此我们必须跳过另一个标记的一部分。也就是说,最短的HTML标记可以以&开头,似乎是3个字符,最长的似乎是6个字符,所以长度为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&与更新where子句一样,以使其不更新任何以“;“在后面的4-7个字符中,&?谢谢SQL替换WHERE子句,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我们有下面的查询,它是用来用HTML等价物(&)替换备注字段中的任何&的。在编写时,我们没有考虑到字段中可能还有其他HTML标记,这些标记也从“&”(即“等”)开始。.由于我们必须确保单独使用时所有的符号都是HTML等效的,而不是另一个标记的一部分,因此我们必须跳过另一个标记的一部分。也就是说,最短的HTML标记可以以&开头,似乎是3个字符,最长的似乎是6个字符,所以长度为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&与更新where子句一样,以使其不更新任何以
UPDATE STOCKMEM
SET INETFDESC = CAST(
REPLACE(
REPLACE(
CAST(INETFDESC as NVarchar(MAX))
,'&','&')
, '&', ,'&')AS NText)
WHERE INETFDESC LIKE '%&[^amp;]%'
也许不是解决这个问题的最好办法,但是 您可以使用下划线
\uuu
作为该位置应有字符的指示符,这样在这种情况下,它实际上就是一个字符计数器。举个简单的例子:
SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&')
WHERE 'This is &[^amp;] just a test.' LIKE '%&___;%'
这不会返回值,因为WHERE
子句中的字符串不包括&
后跟三个字符\u
\u
\u
和分号
SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&')
WHERE 'This is &[^amp;] just a test.' LIKE '%&_____;%'
这将返回一个值,因为WHERE
子句中的字符串满足LIKE
条件:&
(为清晰起见,添加了空格)
也许你可以利用这个优势?这并不漂亮,但我认为它确实起到了作用。
这样做的目的是找到所有不属于实体的符号。
在这里,实体被假定为符号、一个字母、多个字符,然后是半列
set nocount on
--drop table #HtmlTest
select CONVERT( nvarchar(255) ,
N'The & & z; HTML & replacement < > é ε test & a; ' ) as test
into #HtmlTest
select test from #HtmlTest
declare @posStart int, @posStart1 int, @posStart2 int, @posEnd int, @isEntity bit
set @posStart = 1
while (@posStart != 0)
begin
select @posStart1 = charindex('&', test, @posStart + 1) from #HtmlTest
select @posStart2
= patindex('%&[a-z]%;%', substring(test, @posStart + 1, 99999))
+ @posStart from #HtmlTest
set @isEntity = IIF(@posStart1 = @posStart2, 1, 0)
select @posEnd = charindex(';', test, @posStart1 + 1) from #HtmlTest
set @posStart = @posStart1
if (@isEntity = 0 and @posStart1 > 0)
begin
update #HtmlTest
set test = SUBSTRING(test, 1, @posStart1 - 1) + '&'
+ SUBSTRING(test, @posStart1 + 1, 999999)
select test from #HtmlTest
set @posStart += 4
end
end
select test from #HtmlTest
set nocount off
我认为这会起作用:
UPDATE STOCKMEM
SET INETFDESC = CAST(
REPLACE(
CAST(INETFDESC as NVarchar(MAX)), '& ', '& ')
) AS NText
)
如果&
是任何标记的一部分,那么它后面不会跟空格,因此将每个&
后面跟空格替换为&
后面跟空格。您考虑过使用正则表达式吗?不确定这是否是一个选项,但如果我有这个问题,我会将SSI与C脚本任务一起使用。使用programmi通常可以更好地处理这些事情然后在sql中使用ng语言。