<Component>
<Caption>2 7/8" x 1",Drill Collar,2 3/8 PAC</Caption>
<Description>2 7/8" x 1",Drill Collar,2 3/8 PAC</Description>
<Count>1</Count>
<Sections>
<Section>
<Material>Steel AISI 4145</Material>
<Connection>2 3/8 PAC</Connection>
<Weight>28.7197</Weight>
<Length>0.508</Length>
</Section>
<Section>
<Material>Steel AISI 4145</Material>
<Connection>NC50</Connection>
<Weight>28.7197</Weight>
<Length>0.508</Length>
</Section>
<Section>
<Material>Steel AISI 4145</Material>
<Connection>NC36</Connection>
<Weight>28.7197</Weight>
<Length>0.508</Length>
</Section>
</Sections>
</Component>
我在SQLServer 2008 R2中有一个Component表,它有一个PK ID字段和另一个XML类型的列。在那个XML列中,我有一个看起来像你上面看到的XML。对于每一行,我想修改所有嵌套的Section块,这样它们每个都有两个额外的元素。这就是我尝试过的,它只将新元素插入到第一个区块中......而不是其他两个。
DECLARE @MaxFeatures XML
SET @MaxFeatures = N'<MaxAllowableTorque>0</MaxAllowableTorque>
<MaxAllowableForce>0</MaxAllowableForce>'
Update Component
SET XMLDetails.modify('
insert sql:variable("@MaxFeatures")
after (/Component/Sections/Section/Length)[1]
')
答案 0 :(得分:1)
您一次只能插入XML中的一个位置,因此您需要在循环中执行此操作。
一次更新一个节点,并在没有更新的情况下退出循环。
declare @MaxFeatures xml
set @MaxFeatures = N'<MaxAllowableTorque>0</MaxAllowableTorque>
<MaxAllowableForce>0</MaxAllowableForce>'
declare @I int
set @I = 1
while 1 = 1
begin
update Component
set XMLDetails.modify('
insert sql:variable("@MaxFeatures")
after ((/Component/Sections/Section/Length)[sql:variable("@I")])[1]')
where XMLDetails.exist('(/Component/Sections/Section/Length)[sql:variable("@I")]') = 1
if @@rowcount = 0
break
set @I = @I + 1
end