/*
通过使用FOR XML与一些关键字组合可以生成XML格式,经常使用的一些
关键字有AUTO, RAW, PATH or EXPLICIT。下面具体说明如何使用这些
关键字来生成XML。下面使用了ATUO,RAW方法来生车XML格式数据。
*/
/*
下面生成一张测试表
*/
--CREATE TABLE Employees
--(
-- EmployeeID INT,
-- Name NVARCHAR(20),
-- Phone NVARCHAR(20),
-- SEX NVARCHAR(10)
--)
--INSERT INTO Employees
--SELECT 1, 'tudou', '15958944683','男' UNION ALL
--SELECT 2, 'shuige', '00000000000','男' UNION ALL
--SELECT 3, 'xiaozhu', '11111111111','男'
--1.生成xml最简单的方法是使用AUTO关键字
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML AUTO
/*
<Employees EmployeeID="1" Name="tudou" Phone="15958944683" SEX="男" />
<Employees EmployeeID="2" Name="shuige" Phone="00000000000" SEX="男" />
<Employees EmployeeID="3" Name="xiaozhu" Phone="11111111111" SEX="男" />
*/
--2.虽然上面查询返回的是XML格式,但是结果的类型不是XML类型,而是
-- NVARCHAR类型.要想返回XML类型需要使用TYPE关键字.
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML AUTO,TYPE
--返回结果和上面一样
--3.默认情况下返回的值是作为属性,有时候需要返回的值作为节点。
-- 需要使用关键ElementS
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML AUTO,TYPE,Elements
/*
<Employees>
<EmployeeID>1</EmployeeID>
<Name>tudou</Name>
<Phone>15958944683</Phone>
<SEX>男</SEX>
</Employees>
<Employees>
<EmployeeID>2</EmployeeID>
<Name>shuige</Name>
<Phone>00000000000</Phone>
<SEX>男</SEX>
</Employees>
<Employees>
<EmployeeID>3</EmployeeID>
<Name>xiaozhu</Name>
<Phone>11111111111</Phone>
<SEX>男</SEX>
</Employees>
*/
--4.可能你会发现上面的结果没有根节点,那么就需要使用ROOT关键字。
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML AUTO,TYPE,Elements,ROOT
/*
<root>
<Employees>
<EmployeeID>1</EmployeeID>
<Name>tudou</Name>
<Phone>15958944683</Phone>
<SEX>男</SEX>
</Employees>
<Employees>
<EmployeeID>2</EmployeeID>
<Name>shuige</Name>
<Phone>00000000000</Phone>
<SEX>男</SEX>
</Employees>
<Employees>
<EmployeeID>3</EmployeeID>
<Name>xiaozhu</Name>
<Phone>11111111111</Phone>
<SEX>男</SEX>
</Employees>
</root>
*/
--5.可能有时候你需要以别的名字来做根节点的名称那么如下:
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML AUTO,TYPE,Elements,ROOT('优快云')
/*
<优快云>
<Employees>
<EmployeeID>1</EmployeeID>
<Name>tudou</Name>
<Phone>15958944683</Phone>
<SEX>男</SEX>
</Employees>
<Employees>
<EmployeeID>2</EmployeeID>
<Name>shuige</Name>
<Phone>00000000000</Phone>
<SEX>男</SEX>
</Employees>
<Employees>
<EmployeeID>3</EmployeeID>
<Name>xiaozhu</Name>
<Phone>11111111111</Phone>
<SEX>男</SEX>
</Employees>
</优快云>
*/
--6.上面我们看到如何为根制定一个名称,同样也可以为每列制定一个名称。
SELECT EmployeeID AS "编号"
,Name AS "姓名"
,Phone AS "电话"
,SEX AS "性别"
FROM Employees FOR XML AUTO,TYPE,Elements,ROOT('优快云')
/*
<优快云>
<Employees>
<编号>1</编号>
<姓名>tudou</姓名>
<电话>15958944683</电话>
<性别>男</性别>
</Employees>
<Employees>
<编号>2</编号>
<姓名>shuige</姓名>
<电话>00000000000</电话>
<性别>男</性别>
</Employees>
<Employees>
<编号>3</编号>
<姓名>xiaozhu</姓名>
<电话>11111111111</电话>
<性别>男</性别>
</Employees>
</优快云>
*/
--7.上面我们看到为每列制定了一个名称,同样也可以为每行制定一个名称
-- ,AUTO默认是表名称,需要为表明指定一个别名。
SELECT EmployeeID AS "编号"
,Name AS "姓名"
,Phone AS "电话"
,SEX AS "性别"
FROM Employees "员工" FOR XML AUTO,TYPE,Elements,ROOT('优快云')
/*
<优快云>
<员工>
<编号>1</编号>
<姓名>tudou</姓名>
<电话>15958944683</电话>
<性别>男</性别>
</员工>
<员工>
<编号>2</编号>
<姓名>shuige</姓名>
<电话>00000000000</电话>
<性别>男</性别>
</员工>
<员工>
<编号>3</编号>
<姓名>xiaozhu</姓名>
<电话>11111111111</电话>
<性别>男</性别>
</员工>
</优快云>
*/
--8.上面我们演示了通过给表指定别名来命名每行的元素名称,这样的方法是方便
-- 但是有时候复杂的查询,别名很容易引起混乱。AUTO关键字不提供方法来命名
-- 可以通过RAW关键字来轻松定义行名称
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML RAW('员工'),TYPE,Elements,ROOT('优快云')
/*
<优快云>
<员工>
<EmployeeID>1</EmployeeID>
<Name>tudou</Name>
<Phone>15958944683</Phone>
<SEX>男</SEX>
</员工>
<员工>
<EmployeeID>2</EmployeeID>
<Name>shuige</Name>
<Phone>00000000000</Phone>
<SEX>男</SEX>
</员工>
<员工>
<EmployeeID>3</EmployeeID>
<Name>xiaozhu</Name>
<Phone>11111111111</Phone>
<SEX>男</SEX>
</员工>
</优快云>
*/
--9.如果表中有列值为NULL的话,我们会发现XML会跳过该行的该列,不会
-- 出现在XML中。
--来更新一个NULL查询生成XML看看
--UPDATE Employees SET SEX=NULL WHERE EmployeeID=1
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML RAW('员工'),TYPE,Elements,ROOT('优快云')
/*
<优快云>
<员工>
<EmployeeID>1</EmployeeID>
<Name>tudou</Name>
<Phone>15958944683</Phone>
</员工>
<员工>
<EmployeeID>2</EmployeeID>
<Name>shuige</Name>
<Phone>00000000000</Phone>
<SEX>男</SEX>
</员工>
<员工>
<EmployeeID>3</EmployeeID>
<Name>xiaozhu</Name>
<Phone>11111111111</Phone>
<SEX>男</SEX>
</员工>
</优快云>
*/
--10.上面土豆的性别没有了,为了避免这样的情况发生我们需要使用XSINIL关键字
SELECT EmployeeID
,Name
,Phone
,SEX
FROM Employees FOR XML RAW('员工'),TYPE,Elements XSINIL,ROOT('优快云')
/*
<优快云 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<员工>
<EmployeeID>1</EmployeeID>
<Name>tudou</Name>
<Phone>15958944683</Phone>
<SEX xsi:nil="true" />
</员工>
<员工>
<EmployeeID>2</EmployeeID>
<Name>shuige</Name>
<Phone>00000000000</Phone>
<SEX>男</SEX>
</员工>
<员工>
<EmployeeID>3</EmployeeID>
<Name>xiaozhu</Name>
<Phone>11111111111</Phone>
<SEX>男</SEX>
</员工>
</优快云>
*/