【问题标题】:How to update a SQL table column with XML data如何使用 XML 数据更新 SQL 表列
【发布时间】:2015-08-26 15:17:00
【问题描述】:

表 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>

chtml 的类型为 ntext,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>

chtml 的类型为 ntext,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:

    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:

    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

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

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'

表1(以上更新后):

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>

请帮我解决以下问题:

  • 如何通过查询更新一个表的锚链接值 另一个表数据?
  • 如何更新多个字段,例如 Value3Value5 然后运行更新语句?

【问题讨论】:

  • 如果我们将chtml数据类型设为XML,您的所有问题都可以解决:)
  • @tinka 我能够修复它并使其工作,但&amp;lt; 被插入为&amp;lt;

标签: sql sql-server xml


【解决方案1】:

这是解决问题的方法

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

【讨论】:

  • 我更新了聊天室里的内容。 chat.stackoverflow.com/rooms/88030/xmls
  • Url 中的 ID 也必须与表中的 ID 相同。
  • 它正在用纯文本替换锚。
  • 我有这个:set @xml.modify('replace value of (/root/StartOne/Value3/a/text())[1] with sql:variable("@locTitle")'); set @xml.modify('replace value of (/root/StartOne/Value3/a/@title)[1] with sql:variable("@locTitle")'); set @xml.modify('replace value of (/root/StartOne/Value3/a/@href)[1] with sql:variable("@locUrl")'); 谢谢。
  • 快速提问,这行:Set [chtml] = cast(@xml as nvarchar(max)) 是否应该转换为 ntext,因为正在更新的表的类型是 ntext
猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2020-07-07
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多