您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_remotesql

语法


sp_remotesql <server>, <query>[, <query2>, ... , <query254>]

参数

<server>

是使用 sp_addserver 定义的远程服务器的名称。

<query>

是查询缓冲区,其最大长度为 255 个字符。

<query2> … <query254>

是查询缓存区,其最大长度为 255 个字符。如果提供了这些参数,将把它们与 <query1> 的内容并置为一个查询缓冲区。

示例

示例 1

将查询缓冲区传递到 FREDS_SERVER,该服务器将解释 select @@version 并将结果返回到客户端。SAP ASE 服务器不会解释结果:


sp_remotesql FREDS_SERVER, "select @@version"

####示例 2

在存储过程中使用 sp_remotesql。此示例和上一示例向客户端返回相同的信息:


create procedure freds_version 
as 
exec sp_remotesql FREDS_SERVER, "select @@version" 
go
exec freds_version
go

示例 3

将两个查询缓冲区并置为一个缓冲区,并将完整的 insert 语句传递到 DCO_SERVER 以进行处理。insert 语句的语法是 DCO_SERVER 能够理解的格式。此服务器不解释返回的信息。此示例还检查 @@error 中返回的值。


sp_remotesql DCO_SERVER, 
"insert into remote_table 
(numbercol,intcol, floatcol,datecol )",
"values (109.26,75, 100E5,'10-AUG-85')"
select @@error

示例 4

说明如何将本地变量用作 sp_remotesql 的参数:


declare @servname varchar(30)
declare @querybuf varchar(200)
select @servname = "DCO_SERV"
select @querybuf = "select table_name 
	from all_tables 
	where owner = 'SYS'" 
exec sp_remotesql @servname, @querybuf

用法

使用 sp_remotesql 时,还存在一些其它注意事项:

  • sp_remotesql 与远程服务器建立连接,将查询缓冲区从客户端传递到远程服务器,然后再将结果传递回客户端。本地服务器不解释结果。

  • 可在另一个存储过程内使用 sp_remotesql。

  • 查询缓冲区参数必须是字符表达式,其最大长度为 255 个字符。如果使用类型不是 char 或 varchar 的查询缓冲区,将出现数据类型转换错误。

  • 如果从远程服务器返回的最后一条错误消息的严重级别大于 10,sp_remotesql 会将全局变量 @@error 设置为该消息的值。

  • 如果在事务内发出 sp_remotesql ,SAP ASE 服务器会首先检验远程服务器上是否已启动了事务,然后再传递要执行的查询缓冲区。当该事务终止时,系统将指示远程服务器提交该事务。查询缓冲区的内容执行的工作是由该事务定义的工作单元的一部分。

  • 如果查询缓冲区中包含事务控制语句,将由客户端负责确保事务按预期执行 commit 和 rollback。在查询缓冲区中混用 Transact-SQL 和事务控制命令可能会导致不可预料的结果。

  • 与远程服务器的连接由本地服务器管理。将 connect to 或 disconnect 命令嵌入到查询缓冲区中会导致需要由远程服务器解释的结果。这没有必要,我们也不建议这样做。通常,结果是语法错误。