一简介
Microsoft SQL Server 的 XML功能可以简化将现有代码作为 Web服务提供的任务本文集中讨论了传入和传出 Transact SQL代码的数据与 XML消息(在 Web服务客户机和服务器之间使用)之间的转换
二SQL Server 中的现有代码
SQL Server 的 XML功能简化了将现有 Transact SQL代码作为 Web服务提供的过程这依赖于 SQL Server 中的两项 XML功能
对 Transact SQL的扩展可将关系型数据转换为 XML并且可以对传入的 XML进行语法分析利用 ISAPI模板功能可将传入的 HTTP请求应用于 Transact SQL代码并且可以使用 XSL样式表对传出的 XML进行转换只要可以使用 FORXML子句选定数据SQL Server就可以将 XML返回到 XML模板
SQL Server XML模板
SQL Server XML模板以透明方式执行以下任务
对传入的 HTTP请求进行解码将参数应用于 Transact SQL查询执行查询使用 XSL转换传出的 XML读数据以下示例执行 ISAPI模板中指定的 Transact SQL如果必要可将 HTTP请求传递到 Transact SQL代码并由该代码进行语法分析根据模板中指定的 xsl文件返回的 XML将被转换为 SOAP并返回给 Web服务的客户
Exec GetOrdersXML
以下是模板中引用的 XSL样式表它将存储过程中的 XML转换为 SOAP
xmlns:SOAPENV=
xmlns:m=SomeURI>
最后以下存储过程代码在 Transact SQL SELECT语句中使用 FOR XML EXPLICIT子句来返回 XML订单和订单详细信息从单独的表中选择然后合并到 XML层次中
/*订单是父 XML元素 */
Select as Tag NULL as Parent
OrdersOrderId AS [Order!!OrderId]
OrdersOrderStatus AS [Order!!OrderStatus]
OrdersOrderDate AS [Order!!OrderDate]
OrdersSubTotal AS [Order!!SubTotal]
OrdersTax AS [Order!!Tax]
OrdersShippingHandling AS [Order!!ShippingHandling]
OrdersShipToName AS [Order!!ShipToName]
OrdersShipToAddressId AS [Order!!ShipToAddressId]
NULL AS [OrderDetail!!OrderDetailId]
NULL AS [OrderDetail!!OrderId]
NULL AS [OrderDetail!!ItemId]
NULL AS [OrderDetail!!UnitPrice]
NULL AS [OrderDetail!!Quantity]
from Orders
UNION ALL
/*订单详细信息是子 XML元素 */
select as tag as parent
OrdersOrderId AS [Order!!OrderId]
NULL AS [Order!!OrderStatus]
NULL AS [Order!!OrderDate]
NULL AS [Order!!SubTotal]
NULL AS [Order!!Tax]
NULL AS [Order!!ShippingHandling]
NULL AS [Order!!ShipToName]
NULL AS [Order!!ShipToAddressId]
OrderDetailsOrderDetailId AS [OrderDetail!!OrderDetailId]
OrderDetailsOrderId AS [OrderDetail!!OrderId]
OrderDetailsItemId AS [OrderDetail!!ItemId]
OrderDetailsUnitPrice AS [OrderDetail!!UnitPrice]
OrderDetailsQuantity AS [OrderDetail!!Quantity]
from Orders OrderDetails
where OrdersOrderId = OrderDetailsOrderId
ORDER BY [Order!!OrderId][OrderDetail!!OrderDetailId]
For XML EXPLICIT写数据
以下示例中通过 HTTP请求提供表示层次行数据的 XML然后将其传递到 ISAPI模板中指定的 Transact SQL代码在存储过程中对 XML进行语法分析并进行相应的写入操作
Create Procedure InsertOrder
@Order NVARCHAR() = NULL
@OrderId int Output
DECLARE @hDoc INT
DECLARE @PKId INT
BEGIN TRANSACTION
/*将 XML载入文档以进行分析 */
EXEC sp_xml_preparedocument @hDoc OUTPUT @Order
/*插入订单标头 */
INSERT Orders(CustomerId
OrderDate
ShipToName
ShipToAddressId
OrderStatus)
SELECT *
FROM OPENXML(@hDoc /NewDataSet/Orders)
WITH ( CustomerId int CustomerId
OrderDate Datetime OrderDate
ShipToName nvarchar() ShipToName
ShipToAddressId int ShipToAddressId
OrderStatus int OrderStatus)
SELECT @PKId = @@IDENTITY
/*插入订单详细信息 */
INSERT OrderDetails (OrderId
ItemId
UnitPrice
Quantity)
SELECT @PKId as OrderId ItemId UnitPrice Quantity
FROM OPENXML(@hDoc /NewDataSet/Details)
WITH ( ItemId int ItemId
UnitPrice money UnitPrice
Quantity int Quantity)
/*指定输出参数的值 */
Select @OrderId = @PKId
COMMIT TRANSACTION
/*清除 XML文档 */
EXEC sp_xml_removedocument @hD