使用SQL Server 2005 FOR XML嵌套查询

2016-02-19 18:18 2 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享使用SQL Server 2005 FOR XML嵌套查询,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

  相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸引人的功能包括对Xml数据类型支持、使用PATH模式以及嵌套FOR XML查询支持等,这意味着通过新的FOR XML查询功能可以构造出结构更加灵活的Xml数据。

  在SQL Server 2000中FOR XML查询的结果是直接以文本方式返回到客户端,为支持SQL Server 2005中的Xml数据类型,FOR XML 查询提供了TYPE指令,通过TYPE支持返回结果将会变为Xml数据类型。接下来以SQL Server2005中的AdventureWorks示例数据库为例演练其功能。

  先来看第一个SQL查询:

DECLARE @TestStringValue nvarchar(1024);
SET @TestStringValue = (SELECT ProductID,[Name] FROM Production.Product
WHERE ProductSubcategoryID = 9
FOR XML AUTO);
SELECT @TestStringValue;

  输出结果:

Production.Product ProductID="894" Name="Rear Derailleur"/Production.Product ProductID="945" Name="Front Derailleur"/

  结果为字符串,只是内容格式符合Xml片段要求,不过无法在SQL Server Management Studio中点击以Xml方式显示。

  下面对SQL进行修改,增加TYPE指令:

DECLARE @TestStringValue nvarchar(1024);
SET @TestStringValue = (SELECT ProductID,[Name] FROM Production.Product
WHERE ProductSubcategoryID = 9
FOR XML AUTO,TYPE);

  不出意外,查询结果收到如下错误提示:

  不允许从数据类型xml 到nvarchar 的隐式转换。请使用CONVERT 函数来运行此查询。

  可见通过TYPE指令返回的数据已经转变成Xml类型,改进后的查询语句如下:

DECLARE @XmlTestValue xml;
SET @XmlTestValue = (SELECT ProductID,[Name] FROM Production.Product
WHERE ProductSubcategoryID = 9
FOR XML AUTO,TYPE);
SELECT @XmlTestValue;

  通过SELECT 返回的结果支持Xml方式显示。
 
  了解了TYPE指令的功能后,就可以来看FOR XML查询带给开发者的更多惊喜。以示例数据库的产品表(Production.Product)和产品分类子类表(Production.ProductSubcategory)为例进行演示。

  编写产品子类别为“9”的产品数据查询:

SELECT ProductSubcategoryID,[Name] ,
(SELECT ProductID,[Name] FROM Production.Product Product
    WHERE ProductSubcategoryID = 9
    FOR XML AUTO,TYPE) AS Products
FROM Production.ProductSubcategory AS Category
WHERE ProductSubcategoryID = 9
FOR XML AUTO;

  输出结果如下:

CategoryProductSubcategoryID="9"Name="Derailleurs"
 Products
    ProductProductID="894"Name="Rear Derailleur" /
    ProductProductID="945"Name="Front Derailleur" /
 /Products
/Category

  如果在产品查询子句中不提供TYPE指令,那么输出就会变成下面结果:

CategoryProductSubcategoryID="9"Name="Derailleurs"Products="<Product ProductID="894" Name="Rear Derailleur"/><Product ProductID="945" Name="Front Derailleur"/>" /

  以上几个查询结果都没有带命名空间,不过SQL Server 2005 通过WITH XMLNAMESPACES子句提供了对命名空间的支持,下面的查询将显示一个完整的带默认命名空间的Xml文档。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

WITH XMLNAMESPACES ('uri0' as ns0)
SELECT ProductSubcategoryID,[Name] ,
(SELECT ProductID,[Name] FROM Production.Product Product
    WHERE ProductSubcategoryID = 9
    FOR XML RAW('ns0:Product'),TYPE) AS 'ns0:Products'
FROM Production.ProductSubcategory AS Category
WHERE ProductSubcategoryID = 9
FOR XML RAW('ns0:Category'),ROOT('ns0:Message');

  输出结果:

ns0:Messagexmlns:ns0="uri0"
 ns0:CategoryProductSubcategoryID="9"Name="Derailleurs"
    ns0:Products
      ns0:Productxmlns:ns0="uri0"ProductID="894"Name="Rear Derailleur" /
      ns0:Productxmlns:ns0="uri0"ProductID="945"Name="Front Derailleur" /
    /ns0:Products
 /ns0:Category
/ns0:Message

  如果采用默认命名空间,编写SQL如下:

WITH XMLNAMESPACES (DEFAULT 'http://blog.csdn.net/zhzuo')
SELECT ProductSubcategoryID,[Name] ,
(SELECT ProductID,[Name] FROM Production.Product Product
    WHERE ProductSubcategoryID = 9
    FOR XML AUTO,TYPE) AS Products
FROM Production.ProductSubcategory AS Category
WHERE ProductSubcategoryID = 9
FOR XML AUTO,ROOT('Message');

输出结果:
Messagexmlns="http://blog.csdn.net/zhzuo"
 CategoryProductSubcategoryID="9"Name="Derailleurs"
    Products
      Productxmlns="http://blog.csdn.net/zhzuo"ProductID="894"Name="Rear Derailleur" /
      Productxmlns="http://blog.csdn.net/zhzuo"ProductID="945"Name="Front Derailleur" /
    /Products
 /Category
/Message

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  另外,在SQL Server 2005中增加了FOR XML PATH 模式,通过使用FOR XML PATH 模式可以建立清晰灵活的Xml格式,相比使用FOR XML EXPLICIT更为简单:

WITH XMLNAMESPACES (DEFAULT 'http://blog.csdn.net/zhzuo')
SELECT ProductID AS 'Product/@ProductID',
    Name AS 'Product/Name'
FROM Production.Product
WHERE ProductSubcategoryID = 9
FOR XML PATH(''),ROOT('Products');

输出结果:
Productsxmlns="http://blog.csdn.net/zhzuo"
 ProductProductID="894"
    NameRear Derailleur/Name
 /Product
 ProductProductID="945"
    NameFront Derailleur/Name
 /Product
/Products

  在实际应用过程中,以.NET平台应用开发为例,通过ADO.NET访问SQL Server 2005返回的Xml数据结构可以更加丰富,甚至可以做到不做Xml样式转换直接服务于上一层模块。在企业应用集成方面,以BizTalk平台为例,在调用SQL Adapter的时候可以更加灵活,降低为了制定合理Xml Schema带来的复杂性。目前,最新版本的BizTalk(2006 R2)对使用了SQL Server 2005加强FOR XML功能的存储过程或SQL语句不支持通过SQL适配器向导生成XML Schema,不过这个问题可以直接通过Visual Studio IDE编写符合实际格式的XML Schema来解决。

来源:https://www.tulaoshi.com/n/20160219/1617223.html

延伸阅读
在select查询语句里可以嵌入select查询语句,称为嵌套查询。有些书上将内嵌的select语句称为子查询,子查询形成的结果又成为父查询的条件。 子查询可以嵌套多层,子查询操作的数据表可以是父查询不操作的数据表。子查询中不能有order by分组语句。 4.4.1 简单嵌套查询 在执行下列语句。 ――――――――――――――...
标签: SQLServer
摘要 在本系列文章中,我们将深入探讨如何把.NET 2.0和SQL Server 2005的查询通知特征联合起来,以便通知应用程序何时关键数据发生变化进而达到消除反复查询数据库的目的。 一. 引言 数据库应用程序的典型问题之一是更新陈旧的数据。 设想有一个典型的显示产品及其分类的电子商务网站。一个供应商的产品列表很可能并不经常发...
本文给出了类型化和非类型化XML列各自的优势、将SQL Server 2000数据库迁移到SQL Server2005,新的异常处理如何工作;如果表的架构发生更改,我如何执行操作等,供大家参考! SQL Server 2005 包括对Transact-SQL (T-SQL) 语言的几项重要改进。新增功能之一是一种新的触发器,它在数据定义语言 (DDL) 语句运行时激发。在跟踪或保护数...
标签: SQLServer
  /* 'bcp' 不是内部或外部命令,也不是可运行的程序? 看看在C:\Program Files\Microsoft SQL Server\80\Tools\Binn里面有没有bcp.exe这个文件 然后看看path里面加C:\Program Files\Microsoft SQL Server\80\Tools\Binn这个目录没有. 右键我的电脑--属性--高级--环境变量--在系统变量中找到path--编辑 在变量值的最后加上: C:\Prog...
近公司与一家供应商合作,要求把供应商的xml 数据导入到我公司的数据库中,以方便业务处理.我公司使用的是SQL SERVER 2005 数据库.查了一下帮助文件,很简单的写了个脚本,如下: SELECT * into #temp1 FROM OPENROWSET(    BULK 'D:

经验教程

404

收藏

40
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部