2017-01-23 82 views
0

我有從XML應用程序傳遞的XML格式數據。傳遞XML多級數據作爲參數並在存儲過程中使用

在SQL Server存儲過程中,此數據作爲XML參數傳入。我想讀取並保存所需表格中的數據,如TblOrderTblItem

在XML中,將會有多個訂單。每個訂單都相應地包含一個或多個項目。在其操作需要

結構來實現:

<?xml version="1.0" encoding="UTF-8"?> 
<Orders> 
    <Order> 
    <B2>B2**ABIJ**0000884443**PP</B2> 
    <CreateBy null="true" /> 
    <CreateDate>/Date(1485150414358)/</CreateDate> 
    <CurrencyId>1</CurrencyId> 
    <CustomerId>13</CustomerId> 
    <DeliveryAddress>LIBERTY PRESS LLC</DeliveryAddress> 
    <DeliveryCity>SPRINGVILLE UT 84663</DeliveryCity> 
    <DeliveryCityId>0</DeliveryCityId> 
    <DeliveryDate>/Date(1478750400000)/</DeliveryDate> 
    <DeliveryId>14</DeliveryId> 
    <DeliveryState>UT</DeliveryState> 
    <DeliveryStateId>16</DeliveryStateId> 
    <DeliveryType>Delivery</DeliveryType> 
    <EquipmentId>4</EquipmentId> 
    <Items> 
     <Item> 
     <CSA>false</CSA> 
     <CTPAT>false</CTPAT> 
     <CommodityItem>General Freight</CommodityItem> 
     <CommodityItemId>0</CommodityItemId> 
     <CustCommodityItem null="true" /> 
     <FAST>false</FAST> 
     <Hazmat>false</Hazmat> 
     <Height null="true" /> 
     <IsActive>false</IsActive> 
     <ItemId>0</ItemId> 
     <ItemName>Item A</ItemName> 
     <Length null="true" /> 
     <Make null="true" /> 
     <Mass null="true" /> 
     <MassUnit null="true" /> 
     <Model null="true" /> 
     <OrderId>0</OrderId> 
     <PIP>false</PIP> 
     <PilotCar>false</PilotCar> 
     <ReeferTemp null="true" /> 
     <Tarp>false</Tarp> 
     <TrailerType null="true" /> 
     <TruckType null="true" /> 
     <VIN null="true" /> 
     <Width null="true" /> 
     <Year null="true" /> 
     </Item> 
    </Items> 
    <L11>L11*SYL884443*BM</L11> 
    <LastUpdate>/Date(1485150414358)/</LastUpdate> 
    </Order> 
    <Order> 
    ... 
    <Items> 
     <Item> 
     ... 
     </Item> 
    </Order> 
</Orders> 

步驟我要實現的是:從存儲過程,這是從.NET應用程序傳遞

  • 讀取XML參數。
  • 循環遍歷XML並在TblOrderTblItem

通過文章去保存數據如下:

我上心訪問第一級(在我的情況下,訂單順序)。 前進有問題訪問第二級,這將是一個集合(在我的情況下,項目的訂單項目)。

預先感謝您的支持

+0

我不知道你的問題是什麼 –

+0

爲什麼你要在解析SQL XML時,你可以在C#中做? – jdweng

+0

我有Schenerio,我需要從.Net應用程序傳遞XML數據作爲參數。 – UJS

回答

1

你有兩種方法:

  • 您可以通過XML 原樣到存儲過程中,做所有的辛勤工作,在T-SQL
  • 您可以在C#中粉碎XML,填充適當的數據對象並使用經典數據存儲。

從我提出的問題來看,你更願意將它作爲XML參數傳遞給存儲過程。有一些事情要知道:

  • C#使用16位的Unicode內部也是如此SQL Server的XML。但是,只要包含encoding="UTF-8",您將無法將此Unicode字符串轉換爲XML ...您可能會將此作爲VARCHAR(MAX)(不是NVARCHAR(MAX)!)傳遞,但如果涉及特殊字符,這可能會導致您遇到麻煩。最好的是,完全切斷第一行(<?xml ...?>聲明)。

  • 您的XML未被正確創建。這是在你的控制之下嗎?如果您包含null="true"(通常不需要!),您應該使用xsi-名稱空間執行此操作。並且日期/時間值之內,XML應該是ISO8601。您的值(如/Date(1485150414358)/)是無格式SQL Server將能夠直接轉換...

不過我看多<Order> -elements多<Item> -elements。你可以如下閱讀:

DECLARE @xml XML= 
N'<Orders> 
    <Order> 
    <B2>B2**ABIJ**0000884443**PP</B2> 
    <CreateBy null="true" /> 
    <CreateDate>/Date(1485150414358)/</CreateDate> 
    <CurrencyId>1</CurrencyId> 
    <CustomerId>13</CustomerId> 
    <DeliveryAddress>LIBERTY PRESS LLC</DeliveryAddress> 
    <DeliveryCity>SPRINGVILLE UT 84663</DeliveryCity> 
    <DeliveryCityId>0</DeliveryCityId> 
    <DeliveryDate>/Date(1478750400000)/</DeliveryDate> 
    <DeliveryId>14</DeliveryId> 
    <DeliveryState>UT</DeliveryState> 
    <DeliveryStateId>16</DeliveryStateId> 
    <DeliveryType>Delivery</DeliveryType> 
    <EquipmentId>4</EquipmentId> 
    <Items> 
     <Item> 
     <CSA>false</CSA> 
     <CTPAT>false</CTPAT> 
     <CommodityItem>General Freight</CommodityItem> 
     <CommodityItemId>0</CommodityItemId> 
     <CustCommodityItem null="true" /> 
     <FAST>false</FAST> 
     <Hazmat>false</Hazmat> 
     <Height null="true" /> 
     <IsActive>false</IsActive> 
     <ItemId>0</ItemId> 
     <ItemName>Item A</ItemName> 
     <Length null="true" /> 
     <Make null="true" /> 
     <Mass null="true" /> 
     <MassUnit null="true" /> 
     <Model null="true" /> 
     <OrderId>0</OrderId> 
     <PIP>false</PIP> 
     <PilotCar>false</PilotCar> 
     <ReeferTemp null="true" /> 
     <Tarp>false</Tarp> 
     <TrailerType null="true" /> 
     <TruckType null="true" /> 
     <VIN null="true" /> 
     <Width null="true" /> 
     <Year null="true" /> 
     </Item> 
    </Items> 
    <L11>L11*SYL884443*BM</L11> 
    <LastUpdate>/Date(1485150414358)/</LastUpdate> 
    </Order> 
</Orders>'; 

--the查詢

SELECT --elements of Order 
     o.value(N'(B2)[1]',N'nvarchar(max)') AS B2 

     --very strange date-format... 
     ,o.value(N'(CreateDate)[1]',N'nvarchar(max)') AS CreateDate 
     --typed INT 
     ,o.value(N'(CurrencyId)[1]',N'int') AS CurrencyId 

     --more like this 

     --elements of Item 
     ,i.value(N'(CSA)[1]',N'nvarchar(max)') AS CSA 

     --There's no need for *null="true"* 
     --Query the "/text()" and the empty element will be NULL 
     ,CASE WHEN i.value(N'(CustCommodityItem/@null)[1]',N'nvarchar(max)')=N'true' THEN NULL ELSE i.value(N'(CustCommodityItem)[1]',N'nvarchar(max)') END AS CustCommodityItem_complicated 
     ,i.value(N'(CustCommodityItem)[1]',N'nvarchar(max)') AS CustCommodityItem_empty 
     ,i.value(N'(CustCommodityItem/text())[1]',N'nvarchar(max)') AS CustCommodityItem_null 


FROM @xml.nodes(N'/Orders/Order') AS A(o) 
OUTER APPLY o.nodes(N'Items/Item') AS B(i) 
+0

謝謝@Shnugo,它適合我。請你分享一些可以在SQL服務器中探索XML的更多鏈接。 – UJS

+0

@UJS只需使用搜索引擎並搜索「SQL Server XML」,您就會發現大量的教程。一個好的網站 - 至少有人這樣說 - 應該是www.stackoverflow.com,如果你訪問一個用戶檔案(我認爲它叫* Shnugo *),你會發現許多回答的問題*咧嘴笑* – Shnugo

相關問題