注册
 找回密码
 注册
江西广告网
查看: 362|回复: 0
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-1-5 09:02:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
  一、简介   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    <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表