2014-07-11 95 views
0

我有一個xml,它有多個塊,如下所示。如何使用SQL Server從xml的子項目列表中獲取父項值?

declare @Query as xml, 
@poxmldoc INT 

set @Query='<ProductionOrder><Header><MessageID>00000005</MessageID></Header><Body>ProductionOrderDetails>Workorder_ID>100</Workorder_ID<Item_ID>4010124</Item_ID<Publisheddata></Publisheddata><BOM><Position>1</Position><Item_ID>111</Item_ID><BOM_Qty>100</BOM_Qty><UoM>Liters</UoM> 
</BOM><BOM><Position>2</Position><Item_ID>222</Item_ID><BOM_Qty>101</BOM_Qty><UoM>Kilograms</UoM></BOM><BOM><Position>3</Position><Item_ID>333</Item_ID><BOM_Qty>102</BOM_Qty><UoM>Kilograms</UoM></BOM></ProductionOrderDetails><ProductionOrderDetails><Workorder_ID>101</Workorder_ID><Item_ID>4010124</Item_ID><Publisheddata></Publisheddata><BOM><Position>1</Position><Item_ID>111</Item_ID><BOM_Qty>103</BOM_Qty><UoM>Liters</UoM></BOM><BOM><Position>2</Position><Item_ID>222</Item_ID><BOM_Qty>104</BOM_Qty><UoM>Kilograms</UoM></BOM><BOM><Position>3</Position><Item_ID>333</Item_ID><BOM_Qty>105</BOM_Qty><UoM>Kilograms</UoM></BOM></ProductionOrderDetails></Body></ProductionOrder>' 

當我執行此查詢

EXEC SP_XML_PREPAREDOCUMENT @poxmldoc OUTPUT, @Query 

SELECT * 
FROM OPENXML(@poxmldoc, '/ProductionOrder/Body/ProductionOrderDetails/BOM',2) 
    WITH (Position INT 'Position', 
      Item_ID NVARCHAR(40) 'Item_ID', 
      BOM_Qty FLOAT 'BOM_Qty', 
      UoM NVARCHAR(40) 'UoM') 

我得到這樣的輸出:

Position Item_ID BOM_Qty UoM 
------------------------------------ 
1   111 100  Liters 
2   222 101  Kilograms 
3   333 102  Kilograms 
1   111 103  Liters 
2   222 104  Kilograms 
3   333 105  Kilograms 

如何使用這個結果相處的<Workorder_ID>標記值。

像這樣:

Position Item_ID BOM_Qty UoM  Wo_Id 
--------------------------------------------- 
1   111 100  Liters  100 
2   222 101  Kilograms 100 
3   333 102  Kilograms 100 
1   111 103  Liters  101 
2   222 104  Kilograms 101 
3   333 105  Kilograms 101 

回答

0

鑑於你@Query XML變量,你可以這樣使用這個自帶XQuery,讓你在找什麼:

SELECT 
    POSITION = XC.value('(Position)[1]', 'int'), 
    ItemID = XC.value('(Item_ID)[1]', 'int'), 
    BomQty = XC.value('(BOM_Qty)[1]', 'int'), 
    UnitOfMeasure = XC.value('(UoM)[1]', 'varchar(50)'), 
    Workorder_ID = XC.value('(../Workorder_ID)[1]', 'int') 
FROM 
    @Query.nodes('/ProductionOrder/Body/ProductionOrderDetails/BOM') AS XT(XC) 

通過指定(../Workorder_ID)的XPath,你基本上訪問所涉及的<BOM>元素的父元素。

+0

我的xml也會有命名空間。那麼我們如何才能得到result.ex: – user3237193

+0

@ user3237193:如果您有XML名稱空間,請查看T-SQL中的WITH XMLNAMESPACES()'構造 - 請參閱[官方MSDN文檔](http:// msdn .microsoft.com/EN-US /庫/ ms177607.aspx) –

0

使用XPath/XQuery的。即:

select 
    p.value('Position[1]','int'), 
    p.value('Item_ID[1]','int'), 
    p.value('BOM_Qty[1]','int'), 
    p.value('UoM[1]','varchar(20)'), 
    p.value('../Workorder_ID[1]','int') 

from 
    @query.nodes('/ProductionOrder/Body/ProductionOrderDetails/BOM') x(p) 
相關問題