根据其他属性更新tsql列中的xmlstate

时间:2015-12-22 11:43:21

标签: sql-server xml tsql xquery-sql

在tsql中对存储xml数据的列进行更新,从而实现了abit。基本上我想更新缺少某个标志的行。我有一个优势,我知道如果属性part_id = 1存在,那么我想要添加的属性缺失

这是我目前输出xml的一个例子。正如你所看到的那样,groupname缺失,其中part等于1.这是一个特定行中的结构,还有其他行要更新,但是如果我能让这个例子起作用,那就是一个开始。

<report>
  <materials>
    <material part_vendor_name="tests" vendor_pricing_id="wwwewew" part="1"   />
    <material part_vendor_name="tests" vendor_pricing_id="wwwewew" part="2"                     groupname="test" />
  </materials>
</report> 

创建上述结构的代码是

 declare @my_table table ( my_xml_column xml)
insert into @my_table
    select  '<report><materials><material part_vendor_name="tests" vendor_pricing_id="wwwewew" part="1"> </material>
            <material part_vendor_name="tests" vendor_pricing_id="wwwewew" part="2" groupname="test"> </material>
    </materials></report>' 

我可以在报告或材料标记下添加新元素,只是无法更新包含part = 1的行

聚苯乙烯。我最近的尝试如下,但我尝试了很多方法

UPDATE 
 @my_table
  SET @my_table.modify('insert <groupname> test </groupname> after               (/report/materials/material)[1]') 
    WHERE    @my_table.value('(/report/materials/material/part[text() = "1"])[1]', 'varchar(64)') = '1' 

感谢 标记

1 个答案:

答案 0 :(得分:1)

假设您要插入属性 * groupname而不是同名的元素

UPDATE @my_table
SET my_xml_column.modify('
insert attribute groupname {"test"} into(/report/materials/material[@part = "1"])[1]') 
WHERE my_xml_column.exist('/report/materials/material[@part = "1"]') = 1

或者,如果您确实要插入<groupname>元素:

UPDATE @my_table
SET my_xml_column.modify('
insert <groupname> test </groupname> after(/report/materials/material[@part = "1"])[1]') 
WHERE my_xml_column.exist('/report/materials/material[@part = "1"]') = 1

*)请注意,不保留SQL Server中的属性顺序,并且顺序不应更改元素的含义:Sort XML Attributes in SQL