OPENQUERY和远程调用函数

OPENQUERY (Transact-SQL)

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

Topic link icon Transact-SQL 语法约定

语法
  
OPENQUERY ( linked_server ,'query' )  

参数

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

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

备注

OPENQUERY 不接受其参数的变量。

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

EXEC SeattleSales.master.dbo.xp_msver  

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

Permissions

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

示例

A. 执行 UPDATE 传递查询

以下示例针对示例 A 中创建的链接服务器使用 UPDATE 传递查询。

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

B. 执行 INSERT 传递查询

以下示例针对示例 A 中创建的链接服务器使用 INSERT 传递查询。

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

C. 执行 DELETE 传递查询

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

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

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SQL SERVER 通过存储过程和OPENQUERY调用远程函数
CREATE FUNCTION func_Test
(    
    @UserId INT
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT * FROM [192.168.0.252].[User].dbo.func_GetData(@UserId)
)
GO


会报“不允许使用远程表值函数调用。”的错误

 

网上说可以使用OPENQUERY

 

但这个东西没办法直接传参数,


CREATE FUNCTION func_Test
(    
    @UserId INT
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT * FROM OPENQUERY([192.168.0.252],'SELECT * FROM [192.168.0.252].[User].dbo.func_GetData(' + CAST(@UserId AS VARCHAR(20)) + ')')
)
GO

报错
消息102,级别15,状态1,过程func_Test,第9 行
'+' 附近有语法错误。


不管怎么调这个字符串,都不行。语法其实没错误,但一放到OPENQUERY就不行。


后来不用函数,改用存储过程来调用才解决:


CREATE PROCEDURE [dbo].[prd_Test]
    @UserId INT
AS
BEGIN
    DECLARE @myUserId VARCHAR(20);
    SET @myUserId = CAST(@UserId AS VARCHAR(20));
    DECLARE @sql VARCHAR(1000);
    SET @sql = 'SELECT * FROM OPENQUERY([192.168.0.252],''SELECT * FROM [User].dbo.func_GetData(' + @myUserId + ')'')';
    EXEC(@sql);
END


你可能感兴趣的:(SQL数据库)