T-SQL解析XML列问题

时间:2018-01-14 14:49:45

标签: sql-server xml tsql

这就是列xml的样子

<Attributes>
    <ProductAttribute ID="9">
        <ProductAttributeValue>
            <Value>21</Value>
        </ProductAttributeValue>
    </ProductAttribute>
    <ProductAttribute ID="10">
        <ProductAttributeValue>
            <Value>25</Value>
        </ProductAttributeValue>
    </ProductAttribute>
</Attributes>

我希望像

一样返回它
ProductAttribute        ProductAttributeValue
--------------------------------------------------
9                       21
10                      25

我的查询现在看起来像这样

SELECT
    ProductId as ProductId, 
    ProductAttributeNode.value('(@ID)', 'int') as ProductAttributeMappingId,
    ProductAttributeNode.value('(//ProductAttributeValue[1]/Value/text())[1]', 'int') as ProductAttributeValueId
FROM
(
    SELECT
        Id,
        ProductId,
        CAST(AttributesXml as XML) as AttributesXml,
        Sku
    FROM
        ProductAttributeCombination
) AS PAC
CROSS APPLY AttributesXml.nodes('//Attributes/ProductAttribute') as T1(ProductAttributeNode)

我得到的是

ProductAttribute        ProductAttributeValue
--------------------------------------------------
9                       21
10                      21 <--- not 25

1 个答案:

答案 0 :(得分:2)

值方法中的问题是//,每次从我想到的第一个ProductAttribute元素看起来。当您知道父元素时,您不需要//

ProductAttributeNode.value('(//ProductAttributeValue[1]/Value/text())[1]', 'int')

应该是

ProductAttributeNode.value('(./ProductAttributeValue[1]/Value)[1]', 'int')