在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'
感谢 标记
答案 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