通过


OPENQUERY (Transact-SQL)

applies to:SQL ServerAzure SQL Managed Instance

在指定的链接服务器上执行指定的传递查询。 该服务器是 OLE DB 数据源。 OPENQUERY 可以在查询的 FROM 子句中引用,就好象它是一个表名。 OPENQUERY 也可以作为 INSERT、UPDATE 或 DELETE 语句的目标表进行引用。 但这要取决于 OLE DB 访问接口的功能。 尽管查询可能返回多个结果集,但是 OPENQUERY 只返回第一个。

Transact-SQL语法约定

语法

OPENQUERY ( linked_server ,'query' )  

参数

linked_server
表示链接服务器名称的标识符。

query
在链接服务器中执行的查询字符串。 该字符串的最大长度为 8 KB。

注解

OPENQUERY 不接受其参数的变量。

OPENQUERY 不能用于对链接服务器执行扩展存储过程。 但是,通过使用四部分名称,可以在链接服务器上执行扩展存储过程。 例如:

EXEC SeattleSales.master.dbo.xp_msver  

FROM 子句中对 OPENDATASOURCE、OPENQUERY 或 OPENROWSET 的任何调用与对用作更新目标的这些函数的任何调用都是分开独立计算的,即使为两个调用提供的参数相同也是如此。 具体而言,应用到上述任一调用的结果的筛选器或联接条件不会影响其他调用的结果。

权限

任何用户都可以执行 OPENQUERY。 用于连接到远程服务器的权限是从为链接服务器定义的设置中获取的。

示例

A. 执行 UPDATE 传递查询

以下示例对名为 <a0/&a0> 的链接服务器使用直通查询。

UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101')   
SET name = 'ADifferentName';  

B. 执行 INSERT 传递查询

以下示例对名为 <a0/&a0> 的链接服务器使用直通查询。

INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles')  
VALUES ('NewTitle');  

C. 执行 DELETE 传递查询

以下示例使用传递 DELETE 查询删除在示例 B 中插入的行。

DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');  

D. 执行 SELECT 传递查询

以下示例使用传递 SELECT 查询来选择在示例 B 中插入的行。

SELECT * FROM OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');  

另请参阅

DELETE (Transact-SQL)
FROM (Transact-SQL)
INSERT (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
sp_addlinkedserver (Transact-SQL)
sp_serveroption(Transact-SQL)
UPDATE (Transact-SQL)
WHERE (Transact-SQL)