2016-04-05 3 views
2

Вот пример, я пытаюсь вернуть значение атрибута:как вернуть значение атрибута элемента

IF OBJECT_ID(N'tempdb.dbo.#XMLwithOpenXML') IS NOT NULL 
    DROP TABLE #XMLwithOpenXML; 

CREATE TABLE #XMLwithOpenXML 
    (
     [XMLData] [XML] NULL , 
     [LoadedDateTime] [DATETIME] NULL, 
    ); 

INSERT INTO #XMLwithOpenXML 
     (XMLData 
     ) 
VALUES ('<SupplyWeb_Data> 
    <PurchaseOrder> 
    <PO_Header> 
     <status value="stat" /> 
     <po_number value="PO123" /> 
    </PO_Header> 
    <PO_Detail> 
     <cust_part_no value="A123" /> 
     <cust_part_desc value="A123 Desc" /> 
    </PO_Detail> 
    <PO_Detail> 
     <cust_part_no value="B123" /> 
     <cust_part_desc value="B123 Desc" /> 
    </PO_Detail> 
    </PurchaseOrder> 
</SupplyWeb_Data>' 
     ); 

SELECT T2.Loc.value('(/cust_part_no/@Value)[1]', 'varchar(255)') AS cust_part_no , 
     T2.Loc.value('(/cust_part_desc/@Value)[1]', 'varchar(255)') AS cust_part_desc 
FROM #XMLwithOpenXML 
     CROSS APPLY XMLData.nodes('/SupplyWeb_Data/PurchaseOrder/PO_Detail') 
     AS T2 (Loc); 

Я что-то легкое отсутствует, но я не могу понять это. Я думаю, мне нужно использовать функцию values, но она возвращает null.

ответ

2

XQuery чувствителен к регистру, поэтому value не Value и добавьте . до /cust_part_....

SELECT T2.Loc.value('(./cust_part_no/@value)[1]', 'varchar(255)') AS cust_part_no 
     ,T2.Loc.value('(./cust_part_desc/@value)[1]', 'varchar(255)') AS cust_part_desc 
FROM #XMLwithOpenXML x 
CROSS APPLY XMLData.nodes('/SupplyWeb_Data/PurchaseOrder/PO_Detail')AS T2(Loc); 

LiveDemo

+1

блестящий материал @lad – mohan111

+0

удивительный, спасибо! – sqlpadawan

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