/ / XML DML pour 2008 R2..Comment modifier des éléments imbriqués - sql-server, xml-dml

XML DML pour 2008 R2..Comment modifier des éléments imbriqués - sql-server, xml-dml

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

J'ai une table de composants dans SQLServer 2008 R2qui possède un champ d’ID de PK et une autre colonne de type XML. Dans cette colonne XML, j'ai un XML qui ressemble à ce que vous voyez ci-dessus. Pour chaque ligne, je souhaite modifier tous les blocs de section imbriqués afin qu'ils comportent chacun deux éléments supplémentaires. C’est ce que j’ai essayé et cela n’insère que les nouveaux éléments dans le premier bloc Section ... mais pas dans les deux autres.

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]
")

Réponses:

1 pour la réponse № 1

Vous ne pouvez insérer qu'un seul endroit du XML à la fois, vous devez donc le faire en boucle.

Mettez à jour les nœuds un à un et quittez la boucle lorsqu'aucune mise à jour n'est effectuée.

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