1

この XML フラグメントを考えると (VIN は明らかに偽物です)

<VehicleFeed>
  <Vehicle>
    <VIN>1234</VIN>
    <Equipment>
      <EquipmentDesc>1.1</EquipmentDesc>
      <EquipmentDesc>1.2</EquipmentDesc>
      <EquipmentDesc>1.3</EquipmentDesc>
    </Equipment>
  </Vehicle>
  <Vehicle>
    <VIN>2345</VIN>
    <Equipment>
      <EquipmentDesc>2.1</EquipmentDesc>
      <EquipmentDesc>2.2</EquipmentDesc>
      <EquipmentDesc>2.3</EquipmentDesc>
    </Equipment>
  </Vehicle>
</VehicleFeed>

What I really want is this result set

VIN  EquipmentDesc
---  -------------
1234 1.1
1234 1.2
1234 1.3
2345 2.1
2345 2.2
2345 2.3

@xdata という名前の var に xml データがあります。以下のコードは私がうまくいくと思っていたものですが、すべての機器の値を行に分割するのではなく、データの 1 つの列に連結しています。

select t.c.value('VIN[1]', 'varchar(20)') as VIN
     , t1.c1.value('.', 'varchar(80)') as EquipDesc
from @xdata.nodes('//VehicleFeed/Vehicle') as t(c)
cross apply t.c.nodes('Equipment') as t1(c1)

つまり、私は得ています

VIN  EquipmentDesc
---  -------------
1234 1.11.21.3
2345 2.12.22.3

おそらくクロス適用、または説明データの選択 (またはその両方) で、明らかに何か間違っていますが、それが何であるかはわかりません。これは簡単なように見えましたが、私はそれを見ていません。

4

2 に答える 2

1

答えは後でわかりました。私は、EquipmentDesc要素に降りるために、より多くのレベルのクロス適用を追加する必要がありました-脳の損傷、土曜日の夜のコーディング。

cross apply t1.c1.nodes('EquipmentDesc') as t2(c2)

を使用して機器の説明の値を選択します。

, t2.c2.value('.', 'varchar(80)') as EquipDesc

私はクロス適用をあまり頻繁に使用しないため、既存のコードを微調整すると、それが実際に何を意味するのかを忘れがちです。誰かの時間を無駄にしたらごめんなさい。

追加した

最終クエリ (少なくとも関連部分)

select t.c.value('VIN[1]', 'varchar(20)') as VIN
     , t2.c2.value('.', 'varchar(80)') as EquipDesc
from @xdata.nodes('//VehicleFeed/Vehicle') as t(c)
cross apply t.c.nodes('Equipment') as t1(c1)
cross apply t1.c1.nodes('EquipmentDesc') as t2(c2)
于 2013-10-13T00:02:06.317 に答える