如何更新具有xml数据的SQL表列

时间:2015-08-20 13:35:35

标签: sql sql-server xml

我有一个SQL Server表(myTable1),其中包含chtml类型的列(ntext)。

该列将数据存储为XML文本:

<root>
    <StartOne>
        <Value1>Michael, John MD</Value1>
        <Value2>English</Value2>
        <Value3>6900 Ocean Avenue</Value3>
        <Value4>908-783-0909</Value4>
        <Value5>IM</Value5>
    </StartOne>
</root>

我可以使用以下内容查询表:

select
    CONVERT(nvarchar(600), CAST ([chtml] as XML).query('/root/StartOne/Value2')) AS [Value5]
from 
    [myTable1]

我有一个临时表,其中包含Value1的数据行,这两个表都是唯一值。

临时表(StageTable):

Value1              Value2      Value3              Value4          Value5
--------------------------------------------------------------------------
Michael, Jogn MD    Spanish     6900 Ocean Avenue   734-090-1234    NULL

如何编写一个查询来更新临时表中myTable1表中的每个节点。

如果Value2中的myTable1字段与Value2字段相匹配,我在StageTable Value2字段StageTable中尝试了以下Value1字段myTable1)中的UPDATE myTable1 SET myTable1.(CAST ([chtml] as XML).query('/root/StartOne/Value2')) = ST.Value2 FROM myTable1 MT INNER JOIN StageTable ST ON MT.(CAST ([chtml] as XML).query('/root/StartOne/Value1')) = ST.Value1 值:

#image {
    opacity: 0.5;
}

#container {
    background-color: black;
    display: table;
}

我收到以下错误:

  

CAST&#39;附近的语法不正确。

如何解决问题。

1 个答案:

答案 0 :(得分:2)

这是我们如何更新XML的代码

DECLARE @myDoc xml;
SET @myDoc = '<root>
    <StartOne>
        <Value1>Michael, John MD</Value1>
        <Value2>English</Value2>
        <Value3>6900 Ocean Avenue</Value3>
        <Value4>908-783-0909</Value4>
        <Value5>IM</Value5>
    </StartOne>
</root>';
SELECT @myDoc;

-- update text 
SET @myDoc.modify('
  replace value of (/root/StartOne/Value1/text())[1]
  with     "new text "
');
SELECT @myDoc;

更新:如果列数据类型为NTEXT

declare @temp table
(
xmls ntext
)

insert into @temp values (N'<root>
    <StartOne>
        <Value1>Michael, John MD</Value1>
        <Value2>English</Value2>
        <Value3>6900 Ocean Avenue</Value3>
        <Value4>908-783-0909</Value4>
        <Value5>IM</Value5>
    </StartOne>
</root>');

declare @xml xml;
-- here we can put where clause OR loop
select @xml = cast(xmls as xml)
from @temp

set @xml.modify('
  replace value of (/root/StartOne/Value1/text())[1]
  with     "new text "
');

update @temp
set xmls = cast(@xml as nvarchar(max))

select * from @temp