2015-03-25 5 views
0

Я столбец XML в SQL Server заселена:Извлечение данных из столбца XML в SQL Server

<concession> 
    <schema> 
    <data schemaItem="title">Re-label to all boards</data> 
    <data schemaItem="problem">These boards have been tested</data> 
    <data schemaItem="solution">Ask to print new label and add the word "B" on the old serial numbers. so all serial numbers will be modified to new on B .......</data> 
    <data schemaItem="justification">Will help UK test resource</data> 
    <data schemaItem="liability">Us</data> 
    <data schemaItem="parts"> 
     <part>075</part> 
     <part>076</part> 
    </data> 
    <data schemaItem="products"> 
     <product>Pdq </product> 
    </data> 
    <data schemaItem="faultCode">ILB</data> 
    <data schemaItem="processCode">MAT</data> 
    <data schemaItem="quantity">273</data> 
    <data schemaItem="requestedExpiry">14/12/2011</data> 
    </schema> 
</concession> 

Как извлечь значение количества, то есть: 273?

Я пытался, но никакой радости:

SELECT 
    [guid],XMLData, 
    (select xmlData.value('(/concession/schema/data)[1]', 'varchar(100)')), 
    (select xmlData.value('(/concession/schema/data[schemaItem="quantity"])[0]', 'varchar(100)')) 
FROM 
    tc_Concession 

я получить титул в порядке, но не количество.

ответ

1

Try используя Outer Apply С помощью метода nodes(),

SELECT 
     m.c.value('@schemaItem', 'varchar(max)') as SchemaItem, 
     m.c.value('(text())[1]', 'nvarchar(max)') as Value 
FROM Yourtablename 
    OUTER APPLY xml_data.nodes('concession/schema/data') as m(c) 

Это даст вам результат, как,

SchemaItem   Value 
title   Re-label to all boards 
problem   These boards have been tested 
solution   Ask to print new label and add the word "B" on the old serial numbers. so all serial numbers will be modified to new on B ....... 
justification Will help UK test resource 
liability  Us 
parts   NULL 
products   NULL 
faultCode  ILB 
processCode  MAT 
quantity   273 
requestedExpiry 14/12/2011 
1

Вы очень близки. Имя атрибута должно предшествовать @, а индекс должен быть основан на 1. Вам не нужен суб-выбор - метод .value() может использоваться на своем собственном.

SELECT 
    [guid], 
    XMLData, 
    xmlData.value('(/concession/schema/data)[1]', 'varchar(100)'), 
    xmlData.value('(/concession/schema/data[@schemaItem="quantity"])[1]', 'varchar(100)') 
FROM 
    tc_Concession 

Если XML не гарантированно заказывается, вы также должны использовать второй подход для названия.

Смежные вопросы