熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows服務器 >> 正文

使用SQLServer將現有代碼作為Web服務提供

2013-11-11 22:55:41  來源: Windows服務器 

  簡介
  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進行轉換只要可以使用 FOR XML子句選定數據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

From:http://tw.wingwit.com/Article/os/fwq/201311/10240.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.