WIN技巧:使用SQLServer将现有代码作为Web服务提供 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    一、简介

  Microsoft SQL Server 2000的 XML功能可以简化将现有代码作为 Web服务提供的任务,

WIN技巧:使用SQLServer将现有代码作为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 写数据,

电脑资料

WIN技巧:使用SQLServer将现有代码作为Web服务提供》(https://www.unjs.com)。

  

  以下示例中,通过 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

 

最新文章