您的位置:首页 > 数据库

SQL中FOR XML子句的各种用法

2009-04-29 12:02 351 查看




FORXML子句有四种最基本的模式,如上图所示:

1、AUTO模式:返回数据表为起表名的元素,每一列的值返回为属性;

2、RAW模式:返回数据行为<Row>元素,每一列的值作为<Row>元素的属性;

3、PATH模式:通过简单的XPath语法来允许用户自定义嵌套的XML结构、元素、属性值

4、EXPLICIT模式:通过SELECT语法定义输出XML的结构

具体实例如下:

1、AUTO模式

(1).SQL语句:

SELECTEmployeeID,FirstName,LastNameFROMEmployeesFORXMLAUTO,XMLSCHEMA

(2).所生成的XML文件:

返回XML文件的XMLSchema

<xsd:schematargetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1"xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes"elementFormDefault="qualified">
<xsd:importnamespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes"schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd"/>
<xsd:elementname="Employees">
<xsd:complexType>
<xsd:attributename="EmployeeID"type="sqltypes:int"use="required"/>
<xsd:attributename="FirstName"use="required">
<xsd:simpleType>
<xsd:restrictionbase="sqltypes:nvarchar"sqltypes:localeId="1033"sqltypes:sqlCompareOptions="IgnoreCaseIgnoreKanaTypeIgnoreWidth"sqltypes:sqlSortId="52">
<xsd:maxLengthvalue="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attributename="LastName"use="required">
<xsd:simpleType>
<xsd:restrictionbase="sqltypes:nvarchar"sqltypes:localeId="1033"sqltypes:sqlCompareOptions="IgnoreCaseIgnoreKanaTypeIgnoreWidth"sqltypes:sqlSortId="52">
<xsd:maxLengthvalue="20"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="1"FirstName="Nancy"LastName="Davolio"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="2"FirstName="Andrew"LastName="Fuller"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="3"FirstName="Janet"LastName="Leverling"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="4"FirstName="Margaret"LastName="Peacock"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="5"FirstName="Steven"LastName="Buchanan"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="6"FirstName="Michael"LastName="Suyama"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="7"FirstName="Robert"LastName="King"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="8"FirstName="Laura"LastName="Callahan"/>
<Employeesxmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"EmployeeID="9"FirstName="Anne"LastName="Dodsworth"/>
2、RAW模式
(1).SQL语句:

----将元素命名为自定义的名称Employee

SELECTEmployeeID,FirstName,LastNameFROMEmployeesFORXMLRAW('Employee')


(2).所生成的XML文件:

<EmployeeEmployeeID="1"FirstName="Nancy"LastName="Davolio"/>
<EmployeeEmployeeID="2"FirstName="Andrew"LastName="Fuller"/>
<EmployeeEmployeeID="3"FirstName="Janet"LastName="Leverling"/>
<EmployeeEmployeeID="4"FirstName="Margaret"LastName="Peacock"/>
<EmployeeEmployeeID="5"FirstName="Steven"LastName="Buchanan"/>
<EmployeeEmployeeID="6"FirstName="Michael"LastName="Suyama"/>
<EmployeeEmployeeID="7"FirstName="Robert"LastName="King"/>
<EmployeeEmployeeID="8"FirstName="Laura"LastName="Callahan"/>
<EmployeeEmployeeID="9"FirstName="Anne"LastName="Dodsworth"/>



.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}


3、PATH模式:
(1).SQL语句:
SELECTEmployeeID"@ID",FirstName"Name/FirstName",LastName"Name/LastName"
FROMEmployeesFORXMLPATH('Employee')

(2).所生成的XML文件

<EmployeeID="1">
<Name>
<FirstName>Nancy</FirstName>
<LastName>Davolio</LastName>
</Name>
</Employee>
<EmployeeID="2">
<Name>
<FirstName>Andrew</FirstName>
<LastName>Fuller</LastName>
</Name>
</Employee>
<EmployeeID="3">
<Name>
<FirstName>Janet</FirstName>
<LastName>Leverling</LastName>
</Name>
</Employee>
<EmployeeID="4">
<Name>
<FirstName>Margaret</FirstName>
<LastName>Peacock</LastName>
</Name>
</Employee>
<EmployeeID="5">
<Name>
<FirstName>Steven</FirstName>
<LastName>Buchanan</LastName>
</Name>
</Employee>
<EmployeeID="6">
<Name>
<FirstName>Michael</FirstName>
<LastName>Suyama</LastName>
</Name>
</Employee>
<EmployeeID="7">
<Name>
<FirstName>Robert</FirstName>
<LastName>King</LastName>
</Name>
</Employee>
<EmployeeID="8">
<Name>
<FirstName>Laura</FirstName>
<LastName>Callahan</LastName>
</Name>
</Employee>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

4、EXPLICIT模式

问题:加入要生成如下的XML文档该如何操作?

<EmployeeEmpID="1">
<FirstName>Nancy</FirstName>
<LastName>Davolio</LastName>
</Employee>
EXPLICIT模式解决这个问题的应用分为两个主要步骤:
1.定义要输出的XML文档结构;
2.传入实际的数据值;
(1).SQL语句:

--定义输出XML文档的数据结构
SELECT1ASTag,
NULLASParent,
EmployeeIDAS[Employee!1!EmpID],
FirstNameAS[Employee!1!FirstName!element],
LastNameAS[Employee!1!LastName!element]
FROMEmployees
UNIONALL
--传入实际的数据
SELECT1,
NULL,
EmployeeID,
FirstName,
LastName
FROMEmployees
ORDERBY[Employee!1!EmpID],
[Employee!1!FirstName!element],
[Employee!1!LastName!element]
FORXMLEXPLICIT

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

语句含义的解释:

先看看定义XML结构的语句输出结果:





Tag栏用来指定生成元素的嵌套水平;1表示嵌套水平为

Parent栏用来指定当前Tag的父级层次;Null值表示该元素为顶级元素;

EmployeeIDAS[Employee!1!EmpID],

说明:当前元素或属性的父级元素的名称!元素的标签号!元素或属性的名称
FirstNameAS[Employee!1!FirstName!element],

说明:当前元素或属性的父级元素的名称!元素的标签号!元素或属性的名称!指定值作为元素输出

5、为输出的XML文档添加根元素(Rootelement)

(1).SQL语句:

SELECTEmployeeID,FirstName,LastNameFROMEmployeesFORXMLAUTO,ROOT('MyRoot')

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

(2).所生成的XML文件

<MyRoot>
<EmployeesEmployeeID="1"FirstName="Nancy"LastName="Davolio"/>
<EmployeesEmployeeID="2"FirstName="Andrew"LastName="Fuller"/>
<EmployeesEmployeeID="3"FirstName="Janet"LastName="Leverling"/>
<EmployeesEmployeeID="4"FirstName="Margaret"LastName="Peacock"/>
<EmployeesEmployeeID="5"FirstName="Steven"LastName="Buchanan"/>
<EmployeesEmployeeID="6"FirstName="Michael"LastName="Suyama"/>
<EmployeesEmployeeID="7"FirstName="Robert"LastName="King"/>
<EmployeesEmployeeID="8"FirstName="Laura"LastName="Callahan"/>
<EmployeesEmployeeID="9"FirstName="Anne"LastName="Dodsworth"/>
</MyRoot>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: