使用 OPENQUERY 执行脚本

use*_*599 5 sql-server-2008 oracle sql-server import linked-server

我有一个 SQL Server 2008 实例,我想用它从 Oracle 服务器导入数据。

我已经设置了一个链接服务器,它在运行像SELECT * FROM table. 但是,如果我声明一个变量或循环遍历表中的行或OPENQUERY.

是否可以使用OPENQUERY? 我需要额外的权限吗?

Pau*_*ite 10

您可能会看到如下错误:

Msg 7357, Level 16, State 1, Line xx
Cannot process the object "<query text>".
The OLE DB provider "<provider>" for linked server "<server>" indicates that either 
the object has no columns or the current user does not have permissions on that object.
Run Code Online (Sandbox Code Playgroud)

当 SQL Server 尝试发现OPENQUERY语句返回的数据的形状时,就会发生这种情况。这里有许多引人入胜的细节,但结果是OPENQUERY通常最好只使用一个SELECT语句,就像联机丛书中的所有示例一样。

可以使用 做其他事情OPENQUERY,包括执行远程存储过程,但该过程应该只返回一个结果集,并且在此之前应该没有任何事情SELECT可能会破坏 SQL Server 检查结果集形状的方式。

另一种方法是使用EXECUTE ... AT,例如:

DECLARE @Script nvarchar(max) =
    N'
    <some amazing script>
    ';

EXECUTE (@Script) AT <linked_server_name>
Run Code Online (Sandbox Code Playgroud)

有关完整的语法和选项,请参阅联机丛书

您可能需要将链接服务器的服务器选项属性Enable promotion of distributed transactions for RPC设置false为使用以下方法在表中捕获结果:

INSERT <table> (columns)
EXECUTE (@Script) AT <linked server>;
Run Code Online (Sandbox Code Playgroud)

请注意,这可能效率低得多,因为 的结果EXECUTE在被提供给INSERT. 如果结果很大,这可能会有问题。


小智 5

虽然这个问题迟到了,但尽管如此,我还是想加上我的两便士。

在过程“SET NOCOUNT ON”中设置第一行。这将抑制所有受影响的行返回生成的多个结果集。(这个对我有用!)