Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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查询中执行regex(replace)_Sql_Sql Server_Regex_Sql Server 2000 - Fatal编程技术网

在SQL查询中执行regex(replace)

在SQL查询中执行regex(replace),sql,sql-server,regex,sql-server-2000,Sql,Sql Server,Regex,Sql Server 2000,在给定的数据库列中,用替换所有“<”的最佳方法是什么?基本上执行s/<[^;]//gi 注: 必须在2000年工作 必须是可重复的(而不是以;;结尾) 需要进行一些黑客攻击,但我们可以通过如、PATINDEX、左和右以及良好的旧字符串连接来实现 create table test ( id int identity(1, 1) not null, val varchar(25) not null ) insert into test values ('&lt;

在给定的数据库列中,用
替换所有“<”的最佳方法是什么?基本上执行
s/<[^;]//gi

注:

  • 必须在2000年工作
  • 必须是可重复的(而不是以
    ;;
    结尾)

    • 需要进行一些黑客攻击,但我们可以通过PATINDEX以及良好的旧字符串连接来实现

      create table test
      (
          id int identity(1, 1) not null,
          val varchar(25) not null
      )
      
      insert into test values ('&lt; <- ok, &lt <- nok')
      
      while 1 = 1
      begin
          update test
              set val = left(val, patindex('%&lt[^;]%', val) - 1) +
                            '&lt;' +
                            right(val, len(val) - patindex('%&lt[^;]%', val) - 2)
          from test
          where val like '%&lt[^;]%'
      
          IF @@ROWCOUNT = 0 BREAK
      end
      
      select * from test
      
      创建表测试
      (
      id int标识(1,1)不为空,
      val varchar(25)不为空
      )
      
      插入到测试值中(“我认为如果使用不同的东西,这可以做得更干净:)

      创建表测试
      (
      id int标识(1,1)不为空,
      val varchar(25)不为空
      )
      插入测试值(“如何:

          UPDATE tableName
          SET columName = REPLACE(columName , '&lt', '&lt;')
          WHERE columnName LIKE '%lt%'
          AND columnName NOT LIKE '%lt;%'
      
      编辑:

      我刚刚意识到这将忽略带有部分正确
      字符串的列

      在这种情况下,您可以忽略where子句的第二部分,然后调用它:

          UPDATE tableName
          SET columName = REPLACE(columName , '&lt;;', '&lt;')
      

      如果MSSQL的正则表达式风格支持负前瞻,那么这将是正确的方法

      s/&lt(?!;)/&lt;/gi
      
      将捕获<的所有实例,这些实例后面没有(即使它们后面没有任何内容,[^;]也会错过)并且不会捕获以下非
      字符作为匹配的一部分,从而消除了关于原始问题的评论中提到的该字符在替换过程中丢失的问题


      不幸的是,我不使用MSSQL,所以我不知道它是否支持负前瞻…

      非常特定于此模式,但我在过去做过类似的工作:

      REPLACE(REPLACE(columName,”,“<'),“<',”)

      更广泛的示例(对标题属性中可能不合适的字符进行编码)

      REPLACE(更换(
      例如:更换(
      专栏
      --删除现有编码:
      ,“&;”,“&”)
      , '"', '"')
      , ''', '''')
      --恢复/编码:
      ","与","与")
      --编码:
      , '"', '"')
      , '''', ''')
      , ' ', '%20')
      “,”,“%3E”)
      ,“/”,“%2F”)
      ,“\”,“%5C”)
      
      您的替换将“<.”更改为“will
      s/<([^;])/它不会更改。您只能匹配LIKE运算符使用的相同类型的表达式。
      
      s/&lt(?!;)/&lt;/gi
      
      REPLACE(REPLACE(REPLACE(REPLACE(
      REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
          columName
          -- Remove existing encoding:
          , '&amp;', '&')
          , '&#34;', '"')
          , '&#39;', '''')
          -- Reinstate/Encode:
          , '&', '&amp;')
          -- Encode:
          , '"', '&#34;')
          , '''', '&#39;')
          , ' ', '%20')
          , '<', '%3C')
          , '>', '%3E')
          , '/', '%2F')
          , '\', '%5C')