sp_execute_remote(Azure SQL 数据库)

适用于: Azure SQL 数据库

在单个远程 Azure SQL 数据库或在水平分区方案中用作分片的一组数据库中执行 Transact-SQL (T-SQL) 语句。

存储过程是弹性查询功能的一部分。 请参阅 Azure SQL 数据库弹性池概述(预览版)横向扩展云数据库的报告(预览版)

Transact-SQL 语法约定

语法

sp_execute_remote
    [ @data_source_name = ] data_source_name
    , [ @stmt = ] stmt
    [
        { , [ @params = ] N'@parameter_name data_type [ , ...n ]' }
        { , [ @param1 = ] 'value1' [ , ...n ] }
    ]
[ ; ]

参数

[ @data_source_name = ] data_source_name

标识执行语句的外部数据源。 请参阅创建外部数据源。 外部数据源的类型可以是 RDBMSSHARD_MAP_MANAGER

[ @stmt = ] stmt

包含 Transact-SQL 语句或批处理的 Unicode 字符串。 @stmt 必须是 Unicode 常量或 Unicode 变量。 不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符连接两个字符串)。 不允许使用字符常量。 如果指定 Unicode 常量,则它必须带有前缀 N。 例如,Unicode 常量 N'sp_who' 有效,但字符常量 'sp_who' 无效。

字符串的大小仅受可用数据库服务器内存限制。 在 64 位服务器中,字符串大小限制为 2 GB,即 nvarchar(max) 的最大大小。

注意

@stmt 可以包含与变量名称形式相同的参数,例如:N'SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter'

@stmt 中包含的每个参数在 @params 参数定义列表和参数值列表中均必须有对应项。

[ @params = ] N'@parameter_name data_type [ ,... n ]'

一个字符串,包含已嵌入到 @stmt 中的所有参数的定义。该字符串必须是 Unicode 常量或 Unicode 变量。 每个参数定义由参数名称和数据类型组成。 n 是表示附加参数定义的占位符。 必须在 @params 中定义在 @stmt 中指定的每个参数。 如果 @stmt 中的 Transact-SQL 语句或批处理不包含参数,则不需要使用 @params。 此参数的默认值为 NULL

[ @param1 = ] 'value1'

参数字符串中定义的第一个参数的值。 该值可以是 Unicode 常量,也可以是 Unicode 变量。 必须为 @stmt 中包含的每个参数提供参数值。当 @stmt 中的 Transact-SQL 语句或批处理没有参数时,就不需要这些值。

n

附加参数值的占位符。 这些值只能为常量或变量, 不能是很复杂的表达式(例如函数)或使用运算符生成的表达式。

返回代码值

0(成功)或非零(失败)。

结果集

从第一个 T-SQL 语句返回结果集。

权限

需要 ALTER ANY EXTERNAL DATA SOURCE 权限。

注解

必须按语法部分中所述的特定顺序输入 sp_execute_remote 参数。 如果这些参数的输入顺序不正确,则会显示一条错误消息。

sp_execute_remoteEXECUTE 的行为相同,无论是批处理还是名称的范围。 直到执行 sp_execute_remote 语句,才会编译 @stmt 参数中的 T-SQL 语句或批处理。

sp_execute_remote 向名为“$ShardName”的结果集添加一个附加列,其中包含生成行的远程数据库的名称。

可以与 sp_executesql 的方式使用 sp_execute_remote

示例

A. 基本示例

以下示例在远程数据库上创建和执行基本的 SELECT 语句。

EXEC sp_execute_remote
    N'MyExtSrc',
    N'SELECT COUNT(w_id) AS Count_id FROM warehouse';

B. 具有多个参数的示例

此示例执行以下操作:

  1. 在用户数据库中创建数据库范围的凭据,指定 master 数据库的管理员凭据。

  2. 创建指向 master 数据库并指定数据库范围的凭据的外部数据源。

  3. master 数据库中执行 sp_set_firewall_rule 流程。 sp_set_firewall_rule 过程需要 3 个参数,并且要求 @name 参数为 Unicode。

EXEC sp_execute_remote @data_source_name = N'PointToMaster',
    @stmt = N'sp_set_firewall_rule @name, @start_ip_address, @end_ip_address',
    @params = N'@name nvarchar(128), @start_ip_address varchar(50), @end_ip_address varchar(50)',
    @name = N'TempFWRule',
    @start_ip_address = '0.0.0.2',
    @end_ip_address = '0.0.0.2';