用于发送本机 XML Web 服务请求的示例应用程序

后续版本的 Microsoft SQL Server 将删除该功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

以下工作示例用以说明如何发送 SOAP 请求以及如何处理响应。这些示例包括 Visual Studio 2005 客户端(C# 和 Visual Basic)。

初始安装

所有示例应用程序都需要执行一般安装。此安装包括下列步骤:

  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 端点具有访问权限的实际域用户或组。