学院首页>网络编程>SQL Server>深入探讨SQL Server 2000对XML的支持

深入探讨SQL Server 2000对XML的支持

作者: 来源: 添加时间:2006-5-22 11:12:35
 file2.xml 
   <Northwind xmlns:sql= 
   "urn:schemas-microsoft-com:xml-sql"> 
   <sql:query> 
   SELECT Customers.CustomerID, Customers.ContactName, 
   Orders.OrderID, Orders.CustomerID 
   FROM Customers 
   INNER JOIN Orders 
   ON Customers.CustomerID = Orders.CustomerID 
   FOR XML AUTO 
   </sql:query> 
   </Northwind> 
  这段代码中使用了一个名为sql的前缀和一个URI urn:sche
mas-microsoft-com:xml-sql,这个前缀用来标识使用在 SQL Server XML ISAPI上的元素。
有一个元素名为query,顾名思义它就是用来标记模板文件中的SQL 查询语句。好,让我们来
演示一下如何使用这个模板吧!请在地址栏中输入,http://localho
st/northwind/templates/file2.xml,当然你也可以根据你的需要改变相应的服务器名和虚拟
  让我们把这个 URL拆分成单独的片段,进行分析,你可以看见,我们先使用了 
northwind虚拟根,然后使用templates虚拟目录名,如前我们说过,该虚拟目录名已经映射
到templates的物理目录中。最后, URL给出了模板文件的名称。执行这个模板,浏览器就会
把表中customers元素下嵌套的不同的订单以XML文档的形式显示出来。 
  使用模板而不使用 URL查询有许多优点。首先,现在一个最终用户就没有改变SQL语
句的权力了,去除“通过URL查询访问 SQL Server服务器”的选项 ,就只有SQL Server XML 
ISAPI可以用来处理模板文件,这就避免未经授权的 插入、更新和删除程序被执行。其次,
XML模板支持动态加入参数,这就允许你不用更改模板文件就可以更改一个 SQL WHERE子句的
  使用参数,就像插入一个 XML header元素一样简单的,在 header元素中,定义了一
个 param元素,使用一个值为CustomerID的名称属性。这个参数被赋予一个默认值"A",你可
以象在一个存储过程中一样在模板文件中使用这个参数,只要在这个参数前添加一个@,然后
把它放入SQL语句或用来调用一个存储过程就可以了。请见下面的代码。 
   <Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
   <sql:header> 
   <sql:param name=’CustomerID’>A</sql:param> 
   </sql:header> 
   <sql:query> 
   SELECT Customers.CustomerID, Customers.ContactName, 
   Orders.OrderID, Orders.CustomerID 
   FROM Customers 
   INNER JOIN Orders 
   ON Customers.CustomerID = Orders.CustomerID 
  WHERE Customers.CustomerID LIKE @CustomerID + ’%’ 
   FOR XML AUTO 
   </sql:query> 
   </Northwind> 
  在本例中,CustomerID参数被一个WHERE子句使用。如果把参数设为"B",SQL 语句就
会从Customers和Orders表中返回所有的CustomerID以B开头的行。调用模板并传递正确的
CustomerID参数值,只要在查询字符串之后加上参数名和参数值,如:
/northwind/templates/file2.xml?CustomerID=B即可,就这么简单。 
   四、XPath查询 架构和模板 
  XPath查询也可以被内嵌进一个XML模板文件中,下面的代码是一个包含XPath查询
   <Northwind xmlns:sql= 
   "urn:schemas-microsoft-com: 
   xml-sql"> 
   <sql:xpath-query mapping-schema= 
   "file4.xdr"> 
   /Customer[@CustomerID= 
   ’ALFKI’]/Order 
   </sql:xpath-query> 
   </Northwind> 
  这个查询使用了一个架构(schema)返回CustomerID号为ALFKI的用户的所有的订单,
如果想要使XPath语句运行,必须使用一个XDR架构文件映射不同的XML元素和属性到相应的数
据库表和字段名。下面给出了这个架构文件。 
   <?xml version="1.0" ?> 
   <Schema xmlns="urn:schemas-microsoft-com:xml-data" 
   xmlns:dt="urn:schemas-microsoft-com:datatypes" 
   xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
   <ElementType name="Customer" sql:relation="Customers"> 
   <AttributeType name="CustomerID" dt:type="id" /> 
   <AttributeType name="CompanyName" /> 
   <AttributeType name="ContactName" /> 
   <AttributeType name="City" /> 
   <AttributeType name="Fax" /> 
   <AttributeType name="Orders" dt:type= 
   "idrefs" sql:id-prefix="Ord-" /> 
   <attribute type="CustomerID" /> 
   <attribute type="CompanyName" /> 
   <attribute type="ContactName" /> 
   <attribute type="City" /> 
   <attribute type="Fax" /> 
   <attribute type="Orders" sql:relation= 
   "Orders" sql:field="OrderID"> 
   <sql:relationship 
   key-relation="Customers" 
   key="CustomerID" 
   foreign-relation="Orders" 
   foreign-key="CustomerID" /> 
   </attribute> 
   <element type="Order"> 
   <sql:relationship 
   key-relation="Customers" 
   key="CustomerID" 
   foreign-relation="Orders" 
   foreign-key="CustomerID" /> 
   </element> 
   </ElementType> 
   <ElementType name="Order" sql:relation="Orders"> 
   <AttributeType name="OrderID" dt:type= 
   "id" sql:id-prefix="Ord-" /> 
   <AttributeType name="EmployeeID" /> 
   <AttributeType name="OrderDate" /> 
   <AttributeType name="RequiredDate" /> 
   <AttributeType name="ShippedDate" /> 
   <attribute type="OrderID" /> 
   <attribute type="EmployeeID" /> 
   <attribute type="OrderDate" /> 
   <attribute type="RequiredDate" /> 
   <attribute type="ShippedDate" /> 
   <element type="OrderDetail"> 
   <sql:relationship 
   key-relation="Orders" 
   key="OrderID" 
   foreign-relation="[Order Details]" 
   foreign-key="OrderID" /> 
   </element> 
   <element type="Employee"> 
   <sql:relationship 
   key-relation="Orders" 
   key="EmployeeID" 
   foreign-relation="Employees" 
   foreign-key="EmployeeID" /> 
   </element> 
   </ElementType> 
   <ElementType name="OrderDetail" sql:relation= 
  "[Order Details]" 
   sql:key-fields="OrderID ProductID"> 
   <AttributeType name="ProductID" dt:type="idref" 
   sql:id-prefix="Prod-" /> 
   <AttributeType name="UnitPrice"/> 
   <AttributeType name="Quantity" /> 
   <attribute type="ProductID" /> 
   <attribute type="UnitPrice"/> 
   <attribute type="Quantity" /> 
   <element type="Discount" sql:field="Discount"/> 
   </ElementType> 
   <ElementType name="Discount" dt:type="string" 
   sql:relation="[Order Details]"/> 
   <ElementType name="Employee" sql:relation="Employees"> 
   <AttributeType name="EmployeeID" dt:type="idref" 
   sql:id-prefix="Emp-" /> 
   <AttributeType name="LastName" /> 
   <AttributeType name="FirstName" /> 
   <AttributeType name="Title" /> 
   <attribute type="EmployeeID"/> 
   <attribute type="LastName" /> 
   <attribute type="FirstName" /> 
   <attribute type="Title" /> 
   </ElementType> 
   </Schema> 
  如果您想深入了解架构文件的话,请参看SQL Server 2000的用户文档或等待我的以
  和内嵌在XML模板文件中的SQL查询语句一样,XPath查询语句使用ur
n:schemas-microsoft-com:xml-sql和sql作为前缀,共同标示用在模板中的自定义元素和属性
,对于XPath查询而言,我们使用一个名为xpath-query的元素来标识查询语法,这个元素也
有一个名为mapping-schema的属性,用来标示相应用以映射表和字段到特定的XML项目的架构
  下面的代码给出了另一个使用更复杂XPath查询的模板文件。 
   <Northwind xmlns:sql= 
   "urn:schemas-microsoft-com:xml-sql"> 
   <sql:xpath-query mapping-schema= 
   "listing4.xdr"> 
   /Customer[@CustomerID= 
   ’ALFKI’]/Order/ 
   Employee[@LastName=’Suyama’] 
   </sql:xpath-query> 
   </Northwind> 
  当执行这个模板文件时,XPath查询返回与某个客户签下订单的雇员(employee)的姓
   <Northwind xmlns:sql= 
   "urn:schemas-microsoft-com:xml-sql"> 
   <Employee EmployeeID="Emp-6" 
   LastName="Suyama" 
   FirstName="Michael" 
   Title="Sales 
   Representative"/> 
   </Northwind> 
  模板文件中使用的XPath查询也可以使用参数,处理过程很象在XSL样式表中使用参
数一样。象XSL一样,使用$指定一个变量。下面的代码说明了如何在一个包含XPath查询的模
   <Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
   <sql:header> 
   <sql:param name="ID"/> 
   </sql:header> 
   <sql:xpath-query mapping-schema="listing4.xdr"> {{should this be 
   /Customer/Order[@OrderID=$ID] 
   </sql:xpath-query> 
   </Northwind> 
  通过在URL中传递参数名和相应的参数值,我们就可以完成把参数传递到模板中的操
   <Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
   <Order OrderID="Ord-10643" EmployeeID= 
   "6" OrderDate="1997-08-25T00:00:00" RequiredDate= 
   "1997-09-22T00:00:00" ShippedDate= 
   "1997-09-02T00:00:00"> 
   <Employee EmployeeID="Emp-6" LastName= 
   "Suyama" FirstName="Michael" Title= 
   "Sales Representative" /> 
   <OrderDetail ProductID="Prod-28" UnitPrice= 
  "45.6" Quantity="15"> 
   <Discount>0.25</Discount> 
   </OrderDetail> 
   <OrderDetail ProductID="Prod-39" UnitPrice= 
  "18" Quantity="21"> 
   <Discount>0.25</Discount> 
   </OrderDetail> 
   <OrderDetail ProductID="Prod-46" UnitPrice= 
   "12" Quantity="2"> 
   <Discount>0.25</Discount> 
   </OrderDetail> 
   </Order> 
   </Northwind> 
  小结 
  通过使用上面我介绍的几种技术,我们可以直接从SQL Server 2000数据库中直接取
得XML数据。如我所介绍,URL查询、XML模板文件、XDR架构和XPath查询提供了强大的功能,
从SQL Server 2000中直接获得XML数据。 
第 2 页,共 2 页 [1] [2]
站内搜索