MicrosoftSQLServer2000的功能可以简化 将现有代码作为 Web 服务提供的任务。本文集中讨论了传入和传出TransactSQL代码的数据与XML消息(在 Web服务客户机和服务器之间使用)之间的转换。
二、SQLServer2000中的现有代码
SQLServer2000的XML功能简化了将现有TransactSQL代码作为Web服务提供的过程。这依赖于SQLServer2000中的两项XML功能:
1.对TransactSQL的扩展可将关系型数据转换为XML,并且可以对传入的XML进行语法分析。利用ISAPI模板功能,可将传入的HTTP请求应用于TransactSQL代码,并且可以使用XSL样式表对传出的XML进行转换。只要可以使用FOR XML子句“选定”数据,SQLServer就可以将XML返回到XML模板。
2.SQLServer2000XML模板
SQLServer2000XML模板以透明方式执行以下任务:
对传入的HTTP请求进行解码将参数应用于TransactSQL查询执行查询使用XSL转换传出的XML读数据以下示例执行ISAPI模板中指定的TransactSQL。如果必要,可将HTTP请求传递到TransactSQL代码,并由该代码进行语法分析。根据模板中指定的.xsl文件,返回的XML将被转换为并返回给Web服务的客户:
ExecGetOrdersXML
以下是模板中引用的XSL样式表,它将存储过程中的XML转换为SOAP:
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:m="Some-URI">
WebService3Example1Response>
WebService3Example1Response>
最后,以下存储过程代码在TransactSQLSELECT语句中使用FORXMLEXPLICIT子句来返回XML。“订单”和“订单详细信息”从单独的表中选择,然后合并到XML层次中:
/*订单是父XML元素*/
Select1asTag,NULLasParent,
Orders.OrderIdAS[Order!1!OrderId],
Orders.OrderStatusAS[Order!1!OrderStatus],
Orders.OrderDateAS[Order!1!OrderDate],
Orders.SubTotalAS[Order!1!SubTotal],
Orders.TaxAS[Order!1!Tax],
Orders.ShippingHandlingAS[Order!1!ShippingHandling],
Orders.ShipToNameAS[Order!1!ShipToName],
Orders.ShipToAddressIdAS[Order!1!ShipToAddressId],
NULLAS[OrderDetail!2!OrderDetailId],
NULLAS[OrderDetail!2!OrderId],
NULLAS[OrderDetail!2!ItemId],
NULLAS[OrderDetail!2!UnitPrice],
NULLAS[OrderDetail!2!Quantity]
fromOrders
UNIONALL
/*订单详细信息是子XML元素*/
select2astag,1asparent,
Orders.OrderIdAS[Order!1!OrderId],
NULLAS[Order!1!OrderStatus],
NULLAS[Order!1!OrderDate],
NULLAS[Order!1!SubTotal],
NULLAS[Order!1!Tax],
NULLAS[Order!1!ShippingHandling],
NULLAS[Order!1!ShipToName],
NULLAS[Order!1!ShipToAddressId],
OrderDetails.OrderDetailIdAS[OrderDetail!2!OrderDetailId],
OrderDetails.OrderIdAS[OrderDetail!2!OrderId],
OrderDetails.ItemIdAS[OrderDetail!2!ItemId],
OrderDetails.UnitPriceAS[OrderDetail!2!UnitPrice],
OrderDetails.QuantityAS[OrderDetail!2!Quantity]
fromOrders,OrderDetails
whereOrders.OrderId=OrderDetails.OrderId
ORDERBY[Order!1!OrderId],[OrderDetail!2!OrderDetailId]
ForXMLEXPLICIT 写数据。
以下示例中,通过HTTP请求提供表示层次行数据的XML,然后将其传递到ISAPI模板中指定的TransactSQL代码。在存储过程中对XML进行语法分析,并进行相应的写入操作:
CreateProcedureInsertOrder
@OrderNVARCHAR(4000)=NULL,
@OrderIdintOutput
DECLARE@hDocINT
DECLARE@PKIdINT
BEGINTRANSACTION
/*插入订单标头*/
OrderDate,
ShipToName,
ShipToAddressId,
OrderStatus)
SELECT*
FROMOPENXML(@hDoc,'/NewDataSet/Orders')
WITH(CustomerIdint'CustomerId',
OrderDateDatetime'OrderDate',
ShipToNamenvarchar(40)'ShipToName',
ShipToAddressIdint'ShipToAddressId',
OrderStatusint'OrderStatus')
SELECT@PKId=@@IDENTITY
/*插入订单详细信息*/
ItemId,
UnitPrice,
Quantity)
SELECT@PKIdasOrderId,ItemId,UnitPrice,Quantity
FROMOPENXML(@hDoc,'/NewDataSet/Details')
WITH(ItemIdint'ItemId',
UnitPricemoney'UnitPrice',
Quantityint'Quantity')
/*指定输出参数的值*/
COMMITTRANSACTION
/*清除XML文档*/