Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL替换WHERE子句_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

SQL替换WHERE子句

SQL替换WHERE子句,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我们有下面的查询,它是用来用HTML等价物(&)替换备注字段中的任何&的。在编写时,我们没有考虑到字段中可能还有其他HTML标记,这些标记也从“&”(即“等”)开始。.由于我们必须确保单独使用时所有的符号都是HTML等效的,而不是另一个标记的一部分,因此我们必须跳过另一个标记的一部分。也就是说,最短的HTML标记可以以&开头,似乎是3个字符,最长的似乎是6个字符,所以长度为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&与更新where子句一样,以使其不更新任何以

我们有下面的查询,它是用来用HTML等价物(&)替换备注字段中的任何&的。在编写时,我们没有考虑到字段中可能还有其他HTML标记,这些标记也从“&”(即“等”)开始。.由于我们必须确保单独使用时所有的符号都是HTML等效的,而不是另一个标记的一部分,因此我们必须跳过另一个标记的一部分。也就是说,最短的HTML标记可以以&开头,似乎是3个字符,最长的似乎是6个字符,所以长度为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&与更新where子句一样,以使其不更新任何以“;“在后面的4-7个字符中,&?谢谢

 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)), '& ', '&amp ')
                 ) AS NText
              )

如果
&
是任何标记的一部分,那么它后面不会跟空格,因此将每个
&
后面跟空格替换为
&
后面跟空格。

您考虑过使用正则表达式吗?不确定这是否是一个选项,但如果我有这个问题,我会将SSI与C脚本任务一起使用。使用programmi通常可以更好地处理这些事情然后在sql中使用ng语言。