3

我的数据库中有一个 Page 表。为简单起见,假设它有两列;标题和 xmlData 它的标题类似于“我的示例”,我有一个 xml 字段,如下所示:

<MA>
  <A>
    <URL>my-example-</URL>
    <id>5</id>
    </A>
</MA>
  1. 我正在尝试查找末尾带有“-”的任何网址的查找替换,并删除唯一的最后一个尾随“-”(如果存在)

  2. 并删除尾随空格(如果有,则为标题)

我可以通过执行来获取需要更改的行

select * from Pages
where title like '% '

(有一些连接和东西,但基本上就是这样)

4

2 回答 2

1

这将替换每行的一次 URL。从您的示例 XML 来看,每行只有一个 URL。

with C1 as
(
  select xmlData,
         xmlData.value('(/MA/A/URL/text())[1]', 'nvarchar(500)') as URL
  from Pages
),
C2 as
(
  select xmlData,
         URL,
         left(URL, len(URL) - 1) as URL2
  from C1
  where right(URL, 1) = '-'
)
update C2 
set xmlData.modify('replace value of (/MA/A/URL/text())[1] 
                    with sql:column("C2.URL2")')

提取 CTE C1 中的 URL 值。
从 URL 中删除最后一个“-”并将其放在 CTE C2 的 URL2 中。同时删除不需要更新的行。
使用modify() 方法更新 XML(xml 数据类型)

这是另一个在查询的 XML 部分中完成工作的版本。

update Pages
set xmlData.modify('replace value of (/MA/A/URL/text())[1] 
                    with fn:substring((/MA/A/URL/text())[1], 1, fn:string-length((/MA/A/URL/text())[1])-1)')
where xmlData.exist('/MA/A/URL[fn:substring(text()[1], fn:string-length(text()[1]), 1) = "-"]') = 1

一次只能更新一个节点,因此如果一行中有多个 URL,则必须将上面的代码循环并执行更新,只要有要更新的内容即可。您可以使用@@ROWCOUNT来检查更新是否更新了任何内容并重做更新,直到@@ROWCOUNT = 0.

于 2013-07-13T17:48:23.247 回答
0

您可以使用 CHARINDEX 函数来检查是否存在字符 '-' 等等,您可以使用 SUBSTIRNG 函数仅抓取部分来替换您的文本。

例子:

declare @a varchar(100)
set @a = 'HI, TODAY IS A - BEAUTIFUL DAY'

select 
    case
        when charindex('-',@a) >= 0 then
        substring(@a, 0, charindex('-',@a)-1) + 
        substring(@a, charindex('-', @a) + 1, 100)
        else @a
    end
于 2013-07-13T12:30:09.180 回答