数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

使用Microsoft SQL Server 2000的XML查询


发布日期:2021年10月04日
 
使用Microsoft SQL Server 2000的XML查询

由于XML本身的诸多优点XML技术已被广泛的使用目前的好多软件技术同XML紧密相关比如微软的net 平台对xml提供了强大的支持提供SystemXml以及其子命名空间下的类型来操作通过核心类型DataSet出色的把关系型数据库同xml进行了紧密集成由于平常许多开发人员使用net 来操作Sql server的到数据集后再转换成xml所以往往忽略TransactSQL查询生成XML数据的强大功能对于一些项目使用XML查询直接通过SQL生成xml会来的更为简便所以我通过在实际项目中的使用和查阅一些资料写成一个知识点一是温故而知新二是对于一些开发者刚好需要这方面的技术而还没有找到比较快捷的学习方式提供一条途径

在SQL SERVER 中查询生成XML的语法表达式比较简洁整个语法如下

SELECT <select_list>

FROM <table_source>

WHERE <search_condition>

FOR XML AUTO | RAW | EXPLICIT [XMLDATA ] [ELEMENTS] [BINARY BASE]

下面我将以Northwind数据库来演示上面的表达式中所包含的各项功能下面的查询语句和返回结果都通过SQL SERVER 查询分析器来执行和得到

使用AUTO模式

该模式我认为在生成单表xml数据方面是用得最多的能满足一般的需要先来看他的简单查询

简单查询

查询语句

SELECT CategoryID

CategoryName

FROM Categories

WHERE CategoryID < FOR XML AUTO

返回结果

<Categories CategoryID= CategoryName=Beverages/>

<Categories CategoryID= CategoryName=Condiments/>

也可以使用别名

查询语句

SELECT CategoryID AS ID

CategoryName

GetDate() as CurrDate

FROM Categories MyTable

WHERE CategoryID < FOR XML AUTO

返回结果

<MyTable ID= CategoryName=Beverages CurrDate=T/>

<MyTable ID= CategoryName=Condiments CurrDate=T/>

连接查询

以两个表为例

查询语句

SELECT CategoriesCategoryID

CategoriesCategoryName

ProductID

ProductName

FROM Categories

JOIN Products ON CategoriesCategoryID = ProductsCategoryID AND ProductID <

WHERE CategoriesCategoryID < FOR XML AUTO

返回结果

<Categories CategoryID= CategoryName=Beverages>

<Products ProductID= ProductName=Chai/>

</Categories>

<Categories CategoryID= CategoryName=Condiments>

<Products ProductID= ProductName=Chang/>

</Categories>

可以看到表连接查询可以生成分层次的Xml不过需要注意的是SELECT子句中的父表的列要排在子表的列的前面否则会出现你不想看到的结果

查询语句

SELECT ProductIDCategoriesCategoryIDCategoriesCategoryNameProductName

FROM Categories

JOIN Products ON CategoriesCategoryID = ProductsCategoryIDand ProductID <

WHERE CategoriesCategoryID <FOR XML AUTO

返回结果

<Products ProductID= ProductName=Chai>

<Categories CategoryID= CategoryName=Beverages/>

</Products>

<Products ProductID= ProductName=Chang>

<Categories CategoryID= CategoryName=Beverages/>

</Products>

<Products ProductID= ProductName=Aniseed Syrup>

<Categories CategoryID= CategoryName=Condiments/>

</Products>

<Products ProductID= ProductName=Chef Anton&aposs Cajun Seasoning>

<Categories CategoryID= CategoryName=Condiments/>

</Products>

使用ELEMENTS选项

使用该选项可以生成以元素为中心的Xml表示默认为属性方式不过属性方式节省空间需要注意的是使用ELEMENTS选项是一种全是或全否的形式不能得到一部分是以元素表示而另一部分以属性表示的Xml数据

查询语句

SELECT CategoryID

CategoryName

FROM Categories

WHERE CategoryID <

FOR XML AUTO ELEMENTS

返回结果

<Categories>

<CategoryID></CategoryID>

<CategoryName>Beverages</CategoryName>

</Categories>

<Categories>

<CategoryID></CategoryID>

<CategoryName>Condiments</CategoryName>

</Categories>

在连接查询时

查询语句

SELECT CategoriesCategoryID

ProductID

ProductName

FROM Categories

JOIN Products ON CategoriesCategoryID = ProductsCategoryIDand ProductID <

WHERE CategoriesCategoryID <FOR XML AUTO ELEMENTS

返回结果

<Categories>

<CategoryID></CategoryID>

<Products>

<ProductID></ProductID>

<ProductName>Chai</ProductName>

</Products>

<Products>

<ProductID></ProductID>

<ProductName>Chang</ProductName>

</Products>

</Categories>

<Categories>

<CategoryID></CategoryID>

<Products>

<ProductID></ProductID>

<ProductName>Aniseed Syrup</ProductName>

</Products>

</Categories>

检索对二进制数据的XPath引用

这是对二进制数据的操作

查询语句

SELECT CategoryID

Picture

FROM Categories

WHERE CategoryID =

FOR XML AUTO

返回结果

<Categories CategoryID= Picture=dbobject/Categories[@CategoryID=]/@Picture/>

使用ELEMENTS方式

查询语句

SELECT CategoryID

Picture

FROM Categories

WHERE CategoryID =

FOR XML AUTOELEMENTS

返回结果

<Categories>

<CategoryID></CategoryID>

<Picture>dbobject/Categories[@CategoryID=]/@Picture</Picture>

</Categories>

使用RAW模式

使用RAW模式不能使用ELEMENTS选项

简单查询

查询语句

SELECT CategoryID

CategoryName AS Nanme

FROM Categories

WHERE CategoryID <

ORDER BY CategoryID DESC

FOR XML RAW

返回结果

<row CategoryID= Nanme=Condiments/>

<row CategoryID= Nanme=Beverages/>

连接查询

查询语句

SELECT CategoriesCategoryID

CategoriesCategoryName

ProductID

ProductName

FROM Categories

JOIN Products ON CategoriesCategoryID = ProductsCategoryIDand ProductID <

WHERE CategoriesCategoryID <= FOR XML RAW

返回结果

<row CategoryID= CategoryName=Beverages ProductID= ProductName=Chai/>

<row CategoryID= CategoryName=Beverages ProductID= ProductName=Chang/>

<row CategoryID= CategoryName=Condiments ProductID= ProductName=Aniseed Syrup/>

               

上一篇:SQL Server连接中三个最常见错误原因分析

下一篇:利用SQL的全局临时表防止用户重复登录