【问题标题】:Can I do a find/replace in t-sql?我可以在 t-sql 中进行查找/替换吗?
【发布时间】:2010-09-15 08:16:49
【问题描述】:

我基本上有一个xml列,我需要在每条记录中查找并替换一个标签值。

【问题讨论】:

    标签: sql xml tsql


    【解决方案1】:

    对于任何真实的东西,我都会使用 xpaths,但有时您只需要一个快速而肮脏的解决方案:

    您可以使用 CAST 将该 xml 列转换为常规 varchar,然后进行正常替换。

    UPDATE xmlTable SET xmlCol = REPLACE( CAST( xmlCol as varchar(max) ), '[search]', '[replace]')

    当您只需要运行快速查询来查找某些内容并且不想处理 xpath 时,同样的技术也使搜索 XML 变得轻而易举。

    SELECT * FROM xmlTable WHERE CAST( xmlCol as varchar(max) ) LIKE '%found it!%'

    编辑:只是想稍微更新一下,如果您收到一条消息,将一个或多个字符从 XML 转换为目标排序规则是不可能的,那么您只需要使用 nvarchar 即可支持unicode。

    CAST( xmlCol as nvarchar(max) )

    【讨论】:

    • @Cory-Mawhorter 您提到 XPath 会“更好”。您将如何使用 XPath 更改 XML 列中的内容?
    • @ArminderDahul 已经有一段时间了,但我认为你可以像set xmlCol.nodes('/somenode/someothernode[@id=sql:variable("@somevar")]/text') = 'blah' 那样做。不确定。 Michael 的回答可能会让您入门。
    【解决方案2】:
    update my_table
    set xml_column = replace(xml_column, "old  value", "new value")
    

    【讨论】:

    • "参数数据类型 xml 对于替换函数的参数 1 无效"
    【解决方案3】:

    要在 XML 列中查找内容,请查看 exists() 方法,如 MSDN here 中所述。

    SELECT * FROM Table
    WHERE XMLColumn.exist('/Root/MyElement') = 1
    

    ...要替换,请使用 modify() 方法,如 here 所述。

    SET XMLColumn.modify('
      replace value of (/Root/MyElement/text())[1]
      with "new value"
    ')
    

    ..所有假设 SqlServer 2005 或 2008。这是基于 XPath,您需要知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多