如何使用 XML 数据更新 SQL 表列

2021-10-01 00:00:00 xml sql sql-server

表 1:

id      title               chtml
0       Lopez, Michelle MD  <root><StartOne><Value1>Lopez, Michelle MD</Value1><Value2>Spanish</Value2><Value3><a title="49 west point" href="myloc.aspx?id=56" target="_blank">49 west point</a></Value3><Value4>908-783-0909</Value4><Value5><a title="CM" href="myspec.aspx?id=78" target="_blank">CM</a></Value5></StartOne></root>
1       Michael, Jogn, MD   <root><StartOne><Value1>Michael, Jogn, MD</Value1><Value2>English</Value2><Value3><a title="99 show drive" href="myloc.aspx?id=05" target="_blank">99 show drive</a></Value3><Value4>908-783-0909</Value4><Value5><a title="KM" href="myspec.aspx?id=40 target="_blank">KM</a></Value5></StartOne></root>

chtmlntext 类型,id 0:

The chtml is of type ntext for id 0:

<root>
    <StartOne>
        <Value1>Lopez, Michelle MD</Value1>
        <Value2>Spanish</Value2>
        <Value3>
            <a title="49 west point" href="myloc.aspx?id=56" target="_blank">49 west point</a>
        </Value3>
        <Value4>908-783-0909</Value4>
        <Value5>
            <a title="CM" href="myspec.aspx?id=78" target="_blank">CM</a>
        </Value5>
    </StartOne>
</root>

chtmlntext 类型,id 1:

The chtml is of type ntext for id 1:

<root>
    <StartOne>
        <Value1>Michael, Jogn, MD</Value1>
        <Value2>English</Value2>
        <Value3>
            <a title="99 show drive" href="myloc.aspx?id=05" target="_blank">99 show drive</a>
        </Value3>
        <Value4>908-783-0909</Value4>
        <Value5>
            <a title="KM" href="myspec.aspx?id=40 target="_blank">KM</a></Value5>
        </Value5>
    </StartOne>
</root>

Table 2Table 3 包含用于为链接 Url、标题和值创建 Table 1 的数据:

Table 2 and Table 3 has data which is used in the creation of Table 1 for the link Url, title, and value:

Table 2:

    id              title
    ---------------------------------
    56              49 west point
    90              130 chester lane
    12              320 nolan street
    05              99 show drive

Table 3:

    id              description
    ------------------------------
    78              CM
    39              IM
    40              KM

Table 4 包含更新后的数据,用于更新 Table 1 值:

Table 4 has the updated data which will be used to update Table 1 values:

Table 4:

    Name                    Value2              Value3                  Value4              Value5
    --------------------------------------------------------------------------------------------------------------
    Lopez, Michelle MD      English             130 chester lane        908-783-0909        KM
    Michael, Jogn, MD       Italian             320 nolan street        540-029-2090        IM

我正在尝试使用以下查询来更新其中一个值:

I am trying the following query to update one of the value:

declare @xml xml;
select @xml = cast([content_html] as xml)
from [myDB1].[dbo].[Table 1]

set @xml.modify('
  replace value of (/root/StartOne/Value3/text())[1]
  with "<a title="{Value3 from Table 4}" href="myloc.aspx?id={ID from Table 2 that matches the title with the title from Table 4}" target="_blank">{Value3 from Table 4}</a>"
');

-- How can I update the anchor link values of one table by querying another table data.
-- How can I update multiple fields, for Example `Value3` and `Value5`?

update [myDB1].[dbo].[Table 1]
set [content_html] = cast(@xml as nvarchar(max))
where [content_title] = 'Lopez, Michelle MD'

一个例子是:

declare @xml xml;
select @xml = cast([content_html] as xml)
from [myDB1].[dbo].[Table 1]

set @xml.modify('
  replace value of (/root/StartOne/Value3/text())[1]
  with "<a title="130 chester lane" href="myloc.aspx?id=90" target="_blank">130 chester lane</a>"
');

update [myDB1].[dbo].[Table 1]
set [content_html] = cast(@xml as nvarchar(max))
where [content_title] = 'Lopez, Michelle MD'

表一(以上更新后):

id      title               chtml
0       Lopez, Michelle MD  <root><StartOne><Value1>Lopez, Michelle MD</Value1><Value2>Spanish</Value2><Value3><a title="130 chester lane" href="myloc.aspx?id=90" target="_blank">130 chester lane</a></Value3><Value4>908-783-0909</Value4><Value5><a title="CM" href="myspec.aspx?id=78" target="_blank">CM</a></Value5></StartOne></root>
1       Michael, Jogn, MD   <root><StartOne><Value1>Michael, Jogn, MD</Value1><Value2>English</Value2><Value3><a title="99 show drive" href="myloc.aspx?id=05" target="_blank">99 show drive</a></Value3><Value4>908-783-0909</Value4><Value5><a title="KM" href="myspec.aspx?id=40 target="_blank">KM</a></Value5></StartOne></root>

请帮助我解决以下问题:

Please help me with the following:

  • 如何通过查询更新一张表的锚链接值另一个表数据?
  • 如何更新多个字段,例如 Value3Value5然后运行更新语句?
  • How can I update the anchor link values of one table by querying another table data?
  • How can I update multiple fields, for Example Value3 and Value5 and then run the update statement?

推荐答案

这是解决问题的方法

declare @table4 table
(Name nvarchar(22), Value3 nvarchar(22))

    insert into @table4 values ('Lopez, Michelle MD' ,'130 chester lane')       
    insert into @table4 values ('Michael, Jogn, MD ','320 nolan street') 

declare @table1 table
(id int, title nvarchar(max), chtml ntext)


insert into @table1 values (0,'Lopez, Michelle MD',  '<root><StartOne><Value1>Lopez, Michelle MD</Value1><Value2>Spanish</Value2><Value3>
<a title="49 west point" href="myloc.aspx?id=56" target="_blank">49 west point</a></Value3><Value4>908-783-0909</Value4><Value5><a title="CM" href="myspec.aspx?id=78" target="_blank">CM</a></Value5></StartOne></root>')
insert into @table1 values (1,'Michael, Jogn, MD',   '<root><StartOne><Value1>Michael, Jogn, MD</Value1><Value2>English</Value2><Value3><a title="99 show drive" href="myloc.aspx?id=05" target="_blank">99 show drive</a></Value3><Value4>908-783-0909</Value4><Value5><a title="KM" href="myspec.aspx?id=40 target="_blank">KM</a></Value5></StartOne></root>')


declare @xml xml;
select top 1 @xml = cast(chtml as xml)
from @table1

-- How can I update the anchor link values of one table by querying another table data.
declare @titl nvarchar(22)
select @titl = Value3 from @table4 where Name = 'Lopez, Michelle MD'
set @xml.modify('
  replace value of (/root/StartOne/Value3/a/@title)[1]
  with sql:variable("@titl")
');
set @xml.modify('
  replace value of (/root/StartOne/Value3/a/text())[1]
  with sql:variable("@titl")
');

-- How can I update multiple fields, for Example `Value3` and `Value5`?
-- Answer: here you can modify Value5

update @table1
set chtml = cast(@xml as nvarchar(max))
where id = 0

select * from @table1

相关文章