数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2018年04月24日
 
使用SQLServer将现有代码作为Web服务提供

简介

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

               

上一篇:排错的工具:调试器Windbg

下一篇:如何在Access 2002 中进行 Web的具体开发