1

TSQLを介してSQLServer2008でXMLを解析/細断処理しようとしています。ノードの1つに、値が指定されていない次の形式の空白のプロパティがあります。その値を取得できないようで、他のすべての値を破棄します(列をシフトしますか?)

これがtsqlコードと何が悪いのかの写真です:

declare @doc nvarchar(4000)

set @doc = ' 
<Objects>
  <Object>
    <Property Name="Path">some path</Property>
    <Property Name="InstanceName">some instance</Property>
    <Property Name="result1">0.390630000000003</Property>
    <Property Name="result2">63345649697265</Property>
  </Object>
  <Object>
    <Property Name="Path">another path</Property>
    <Property Name="InstanceName" />
    <Property Name="result1">100</Property>
    <Property Name="result2">1002</Property>
  </Object>
 </Objects>
'
  SELECT 
 item.ref.value('(Property/text())[1]', 'nvarchar(128)') AS Path, 
 item.ref.value('(Property/text())[2]', 'nvarchar(128)') AS InstanceName,
 item.ref.value('(Property/text())[3]', 'nvarchar(128)') AS result1,
 item.ref.value('(Property/text())[4]', 'nvarchar(128)') AS result2
  FROM (SELECT CAST(@doc AS XML) AS feedXml) feeds(feedXml) 
   CROSS APPLY feedXml.nodes('/Objects/Object') AS item(ref)

クエリを実行すると、列InstanceNameに、空白、空、またはnullではなく、他の列の値が入力されていることに注意してください。

どんな助けでも大歓迎です。

4

2 に答える 2

2

インデックスだけでなく<Property>、属性を使用してこれらの要素を参照する必要があります。Name

これを試して:

SELECT
    item.ref.value('(Property[@Name="Path"]/text())[1]', 'nvarchar(128)') AS Path,
    item.ref.value('(Property[@Name="InstanceName"]/text())[1]', 'nvarchar(128)') AS InstanceName,
    item.ref.value('(Property[@Name="result1"]/text())[1]', 'nvarchar(128)') AS result1,
    item.ref.value('(Property[@Name="result2"]/text())[1]', 'nvarchar(128)') AS result2
FROM 
    (SELECT CAST(@doc AS XML) AS feedXml) feeds(feedXml) 
CROSS APPLY 
    feedXml.nodes('/Objects/Object') AS item(ref)

InstanceNameこれで、2番目をとして取得する必要がありますNULL

于 2012-11-12T06:02:25.450 に答える
1

括弧内に必要なノードを指定するので[4]、4番目の行が必要であることを意味します。使用するXPath式は、 4番目のテキスト値を提供することProperty/text()を意味します。2番目のオブジェクトには3つのテキスト値しかないため、値がオフになっています。 代わりに、4番目のプロパティノードの最初のテキスト値が必要であることを指定できます。'(Property/text())[4]'
'(Property[4]/text())[1]'

完全なクエリは次のようになります。

SELECT 
 item.ref.value('(Property[1]/text())[1]', 'nvarchar(128)') AS Path, 
 item.ref.value('(Property[2]/text())[1]', 'nvarchar(128)') AS InstanceName,
 item.ref.value('(Property[3]/text())[1]', 'nvarchar(128)') AS result1,
 item.ref.value('(Property[4]/text())[1]', 'nvarchar(128)') AS result2
  FROM (SELECT CAST(@doc AS XML) AS feedXml) feeds(feedXml) 
   CROSS APPLY feedXml.nodes('/Objects/Object') AS item(ref)

もちろん、プロパティノードが欠落している場合、またはノードの順序が一貫していない場合でも、上記は失敗します。その場合、marc_sによって提供されるクエリを使用する必要があります。

于 2012-11-12T06:32:31.340 に答える