隐形眼镜怎么样的好:超级容易:利用FOR?XML?AUTO扼制XML输出(译转).

来源:百度文库 编辑:九乡新闻网 时间:2024/05/04 12:48:19

这篇文章描写如何穿越利用FOR XML AUTO更好的扼制XML输出款式。例如增加XML符号。用这个来轮换难于会意的FOR XML EXPLICIT 语句。万一你在利用过程中即刻反序列化输出的XML,你就会感受这个消息对你有用。

在For XML从句中,您等闲利用下列措施之一:

RAW

AUTO

EXPLICIT

PATH

万一你想全面扼制发生的XML,能够利用FOR XML EXPLICIT。然而它会意起来相当的艰难,后面还要维护混杂的select语句。FOR XML AUTO 能发生最可读的SELECT语句,然而它也有缺点,不轻率扼制生成的XML。但利用一些技巧,例如穿越利用额外的PATH选项,你能够做一些超过你预期的事情。RAW选项是很少利用,因而不谈论。PATH 选项批准您很轻率地混杂属性和元素。目前,让我们来利用FOR XML AUTO。

在这个例子中,我们利用的是1:N联系的两个容易的数据表。一个表(SalesOrder)包括客户消息的订单,例外一张表(Items)中包括的翔实的项。一个订单能够有多个项,一个项经常只属于一个订单。

以最轻率的开始。

SELECT*FROMsalesorder

发生:ordernumbercustomernamecustomerstreet
-------------------------------------
1parkerfirstav
2lesleysecav

万一你想要使收获集是XML,我们增加FOR XML AUTO 语句:SELECT*FROMsalesorderFORXMLAUTO

它发生:

目前,字段是作属性的,大多数情形下渴望他们是元素。为了做到这点,增加ELEMENTS 参数SELECT*FROMsalesorderFORXMLAUTO,ELEMENTS

它发生:
1
parker

万一你想要改动'salesorder' 标签,利用:SELECT*FROMsalesorderASniceorderFORXMLAUTOwww.xiaochugao.org,ELEMENTS

它发生:
1
parker

当然,这一招也实用的列名:SELECTordernumberASorder_noFROMsalesorderWHEREordernumber=1FORXMLAUTO,ELEMENTS

它发生:
1

万一你想增加其他标签或节点?例如,对有关客户消息增加'customer''符号?但对FOR XML AUTO来说,被验证是很艰难的事件。一个可能的处理计划是利用SELF JOIN (join雷同的表),但我找到一个更轻率措施。穿越一番玩弄和修订,我们利用子查询和有点滥用FOR XML PATH号召。代码SELECT
ordernumber,
(SELECTcustomername,
customerstreetFORXMLPATH(''),
TYPE,ELEMENTS)
ascustomer
FROM
salesorder
FORXMLAUTO,ELEMENTS

它发生:代码
1

parker
firstav



2

lesley
secav

当心利用附带的'TYPE’参数。这将确保子查询的收获将归来的是一个XML种类(作为全副XML种类的收获的一局部),而不是NVARCHAR(MAX)种类。万一您要对全副收获增加外围标签,也是容易的小花样:SELECT(
SELECT
customername
FROM
salesorder
FORXMLAUTO,TYPE,ELEMENTS
)ASorderrequestFORXMLPATH(''),TYPE,ELEMENTS

它发生:

parker


lesley

为什么我们在子查询中不利用FOR XML AUTO?试试,它会发生一个讹谬。当子查询是查询一个切实的表时,您能力利用FOR XML AUTO(上述显明不是)。

万一您想对所出产的XML全面扼制,子查询是条出路。例如说,我们渴望,每个订单,客户的名字和所有的项都属于订单。为此,您利用这么的相干子查询:SELECT
customername,
(SELECT*FROMitemWHEREitem.ordernumber=
salesorder.ordernumberFORXMLAUTO,TYPE,ELEMENTS)
FROM
salesorder
FORXMLAUTO,ELEMENTS

它发生:代码
parker

10
pen
1


11
***
1

当利用关系子查询,你能够利用法定的FOR XML AUTO, TYPE, ELEMENTS 语句。万一你想要在'items'外围有一个标签,只需在子查询后增加as,例如:代码SELECT
customernamediy.riadiy.com,
(SELECT*FROMitemWHEREitem.ordernumber=
salesorder.ordernumberFORXMLAUTO,TYPE,ELEMENTS)
ASorderitems
FROM
salesorder
FORXMLAUTO,ELEMENTS

它发生:代码
parker


10
pen
1


11
***
1


为什么我们不但是容易的连接item表和order表。这有时会导致无须要的和不可料想的情形,波及到发生XML格局:

例如:SELECT
item.description,
salesorder.customername
FROM
salesorder
INNERJOINitemONitem.ordernumber=salesorder.ordernumber
FORXMLAUTO,ELEMENTS

会发生这么的草芥:代码
pen

parker



***

parker

另外,万一利用连接查询,你很难增加一个外围的标签。因而,对于大多数的扼制,利用FOR XML AUTO和关系子查询。

原文:http://om/KB/database/FORXMLAUTO_Controlling.aspx作者:朱祁林
出处:http://zhuqil.cnblogs.com
本文版权归作者和博客园共同,迎接,但未经作者同意定然保留此段声明,且在文章版面显明位置给出原文连接,否则保留追究法令义务的权利。下面推荐的是对于java中经常揭示的一些讹谬的归纳