使用SQLServer将现有代码作为Web服务提供

发表于:2007-06-21来源:作者:点击数: 标签:
一、简介 Microsoft SQL Server 2000的 XML功能可以简化将现有代码作为 Web服务提供的任务。本文集中讨论了传入和传出 Transact SQL代码的数据与 XML消息(在 Web服务客户机和 服务器 之间使用)之间的转换。 二、SQL Server 2000中的现有代码 SQL Server 20

   
  一、简介
  Microsoft SQL Server 2000的 XML功能可以简化将现有代码作为 Web服务提供的任务。本文集中讨论了传入和传出 Transact SQL代码的数据与 XML消息(在 Web服务客户机和服务器之间使用)之间的转换。
  

  二、SQL Server 2000中的现有代码
  SQL Server 2000的 XML功能简化了将现有 Transact SQL代码作为 Web服务提供的过程。这依赖于 SQL Server 2000中的两项 XML功能:
  
  1.对 Transact SQL的扩展可将关系型数据转换为 XML,并且可以对传入的 XML进行语法分析。利用 ISAPI模板功能,可将传入的 HTTP请求应用于 Transact SQL代码,并且可以使用 XSL样式表对传出的 XML进行转换。只要可以使用 FOR XML子句“选定”数据,SQL Server就可以将 XML返回到 XML模板。
  
  2.SQL Server 2000 XML模板
  
  SQL Server 2000 XML模板以透明方式执行以下任务:
  
  对传入的 HTTP请求进行解码将参数应用于 Transact SQL查询执行查询使用 XSL转换传出的 XML读数据以下示例执行 ISAPI模板中指定的 Transact SQL。如果必要,可将 HTTP请求传递到 Transact SQL代码,并由该代码进行语法分析。根据模板中指定的 .xsl文件,返回的 XML将被转换为 SOAP并返回给 Web服务的客户:
  
  Exec GetOrdersXML
  
  以下是模板中引用的 XSL样式表,它将存储过程中的 XML转换为 SOAP:
  
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:m="Some-URI">
  
  最后,以下存储过程代码在 Transact SQL SELECT语句中使用 FOR XML EXPLICIT子句来返回 XML。“订单”和“订单详细信息”从单独的表中选择,然后合并到 XML层次中:
  
  /*订单是父 XML元素 */
  
  Select 1 as Tag, NULL as Parent,
  Orders.OrderId AS [Order!1!OrderId],
  Orders.OrderStatus AS [Order!1!OrderStatus],
  Orders.OrderDate AS [Order!1!OrderDate],
  Orders.SubTotal AS [Order!1!SubTotal],
  Orders.Tax AS [Order!1!Tax],
  Orders.ShippingHandling AS [Order!1!ShippingHandling],
  Orders.ShipToName AS [Order!1!ShipToName],
  Orders.ShipToAddressId AS [Order!1!ShipToAddressId],
  NULL AS [OrderDetail!2!OrderDetailId],
  NULL AS [OrderDetail!2!OrderId],
  NULL AS [OrderDetail!2!ItemId],
  NULL AS [OrderDetail!2!UnitPrice],
  NULL AS [OrderDetail!2!Quantity]
  from Orders
  UNION ALL
  
  /*订单详细信息是子 XML元素 */
  
  select 2 as tag, 1 as parent,
  Orders.OrderId AS [Order!1!OrderId],
  NULL AS [Order!1!OrderStatus],
  NULL AS [Order!1!OrderDate],
  NULL AS [Order!1!SubTotal],
  NULL AS [Order!1!Tax],
  NULL AS [Order!1!ShippingHandling],
  NULL AS [Order!1!ShipToName],
  NULL AS [Order!1!ShipToAddressId],
  OrderDetails.OrderDetailId AS [OrderDetail!2!OrderDetailId],
  OrderDetails.OrderId AS [OrderDetail!2!OrderId],
  OrderDetails.ItemId AS [OrderDetail!2!ItemId],
  OrderDetails.UnitPrice AS [OrderDetail!2!UnitPrice],
  OrderDetails.Quantity AS [OrderDetail!2!Quantity]
  from Orders, OrderDetails
  where Orders.OrderId = OrderDetails.OrderId
  ORDER BY [Order!1!OrderId],[OrderDetail!2!OrderDetailId]
  For XML EXPLICIT 写数据。
  
  以下示例中,通过 HTTP请求提供表示层次行数据的 XML,然后将其传递到 ISAPI模板中指定的 Transact SQL代码。在存储过程中对 XML进行语法分析,并进行相应的写入操作:
  
  Create Procedure InsertOrder
  @Order NVARCHAR(4000) = 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(40) '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

原文转自:http://www.ltesting.net