傳送原生 XML Web Service 要求的範例應用程式

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

下列提供的範例顯示如何傳送 SOAP 要求和處理回應。這些範例包含以 C# 及 Visual Basic 所設計的 Visual Studio 2005 用戶端。

初始安裝

所有的範例應用程式都需要一般安裝。此安裝包含下列步驟:

  1. 建立範例預存程序。

  2. 建立使用者定義函數。

  3. 建立 HTTP SOAP 結束點。

[!附註]

若要在 AdventureWorks 範例資料庫中建立這些物件,您可以使用 SQL Server Management Studio 或 osql 命令公用程式。如需有關如何安裝 AdventureWorks 範例資料庫的詳細資訊,請參閱<安裝 SQL Server 範例和範例資料庫的考量>。

建立預存程序 (GetCustomerInfo)

下列所設計的預存程序是用以顯示,用戶端應用程式如何處理輸入與輸出參數、傳回碼、查詢結果,以及如何在即將發生失敗時處理錯誤。

USE AdventureWorks
GO
DROP PROCEDURE GetCustomerInfo
GO
CREATE PROCEDURE GetCustomerInfo
                    @CustomerID nchar(5),
                    @OutputParam nchar(5) OUTPUT 
AS  

  SELECT @OutputParam = '99999'  
  -- The following INSERT should fail, and an-error returned 
  -- to the client.
  INSERT Store (CustomerID) VALUES (1)

 -- Execute a SELECT statement.
 SELECT top 3 SalesOrderID, OrderDate 
 FROM   Sales.SalesOrderHeader
 WHERE  CustomerID = @CustomerID

 -- Execute SELECT returning XML.
  SELECT CustomerID, SalesOrderID, OrderDate 
  FROM   Sales.SalesOrderHeader
  WHERE  CustomerID = @CustomerID
  for xml auto, XMLSCHEMA

  PRINT 'Hello World'
RETURN 0
Go

此預存程序具有兩個參數:輸入參數 (CustomerID) 與輸出參數 (OutParam),用以顯示如何傳遞參數。

預存程序會執行下列陳述式:

  • 刻意失敗的 INSERT 陳述式,會傳回錯誤。該錯誤會刻意顯示 SOAP 回應中所傳回的錯誤。在 Visual Studio 2005 中,將以 SqlMessage 物件傳回錯誤。

  • SELECT 陳述式。在 Visual Studio 2005 中,將以 DataSet 物件傳回產生的資料列集。

  • 傳回 XML 資料的 SELECT FOR XML 查詢。在 Visual Studio 2005 中,將以 SqlXml 物件傳回產生的資料列集。

  • PRINT 陳述式。此陳述式的結果將在 Visual Studio 2005 中以 SqlMessage 物件傳回。

建立使用者定義函數 (UDFREturningAScalar)

此函數會傳回整數值。

USE AdventureWorks
GO
CREATE FUNCTION UDFReturningAScalar() 
RETURNS int
AS
BEGIN
   RETURN 555
END
Go

建立 HTTP SOAP 結束點 (sql_endpoint)。

此結束點以 Web 方法公開預存程序和使用者定義函數。結束點也設定成允許特定查詢。用戶端應用程式可以將特定查詢的 SOAP 要求傳送至結束點。

請注意您必須在為結束點保留 HTTP 命名空間 (sp_reserve_http_namespace) 以及在完成 SITE 參數時,提供伺服器名稱以做為 hostname 的值。另外,port 的值必須與 SQL Server 執行個體所使用的 HTTP 通訊埠一致,例如 "80" 或所套用的另一個 TCP 通訊埠編號。

USE AdventureWorks
GO
DROP ENDPOINT sql_endpoint
GO
EXEC sp_reserve_http_namespace N'http://hostname:port/sql' 
-- EXEC sp_reserve_http_namespace N'https://www.microsoft.com:80/sql' for example
GO
CREATE ENDPOINT sql_endpoint 
   STATE = STARTED
AS HTTP(
   PATH = '/sql', 
   AUTHENTICATION = (INTEGRATED ), 
   PORTS = ( CLEAR ),
   SITE = 'server'
)
FOR SOAP (
   WEBMETHOD 'http://tempUri.org/'.'GetCustomerInfo' 
            (name='AdventureWorks.dbo.GetCustomerInfo', 
             schema=STANDARD ),
   WEBMETHOD 'UDFReturningAScalar' 
            (name='AdventureWorks.dbo.UDFReturningAScalar'),
   BATCHES = ENABLED,
   WSDL = DEFAULT,
   DATABASE = 'AdventureWorks',
   NAMESPACE = 'http://Adventure-Works/Customers'
)
GO
USE master
EXEC sp_grantlogin @loginame='domain\userOrGroup'
EXEC sp_grantdbaccess @loginame='domain\userOrGroup'
GRANT CONNECT ON ENDPOINT::sql_endpoint TO [domain\userOrGroup]
GO

在前面的程式碼中,請注意下列項目:

  • 為了建立此結束點定義了兩個 Web 方法。

  • WSDL 值是設為 DEFAULT。因此,用戶端可以從伺服器要求 WSDL 回應。

  • BATCHES 值是設為 ENABLED。因此,用戶端可以傳送特定查詢要求至此結束點。

  • Web 方法 UDFReturningAScalar 不會指定選擇性的命名空間。它使用 NAMESPACE 值中所指定的命名空間。

  • 以 SQL Server 登入所建立的 domain\userOrGroup 值,應該設定成需要存取 HTTP 結束點的實際網域使用者或群組。