2012-11-12 49 views
1

我想通過TSQL解析/撕碎SQL Server 2008中的XML,其中一個節點具有以下格式的空白屬性,沒有指定值。我似乎無法檢索該值,並將其拋出了所有其他SQL Server解析XML空屬性

這裏是TSQL代碼的什麼是錯的一個PIC(移動列):

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列是使用另一列中的值填充的,而不是空白,空或空值。

任何幫助表示讚賞。

回答

2

您需要通過使用Name屬性引用那些<Property>元素 - 而不僅僅是索引!

試試這個:

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) 

有了這個,你應該把你的第二InstanceNameNULL

1

在括號內指定你想要的節點,所以[4]意味着你想要第四行。您使用的XPath表達式是Property/text(),這意味着'(Property/text())[4]'會給出第四個文本值。你的第二個對象只有三個文本值,這就是你的值關閉的原因。
相反,您可以指定您想要第四個Property節點'(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) 

,如果你有丟失屬性節點,或者如果節點的順序是不相符的,當然上面仍然會失敗。在這種情況下,您應該使用查詢provided by marc_s