<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 № 1Vous 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