2017-01-23 73 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

相关问题