【问题标题】:Openquery procedure from linked server来自链接服务器的 Openquery 过程
【发布时间】:2016-08-29 16:08:35
【问题描述】:

我正在从服务器 B 调用程序:

select * from openquery(A,'exec sp_qa2')

服务器 A 中的 sp_qa2 是这样的:

use master
go
create procedure sp_qa2
begin
declare @sql nvarchar(1000)
SET @sql = 'USE [?];  EXEC    [dbo].[sp_qa1]'
EXEC sp_MSforeachdb @sql
end

服务器 A 中的 sp_qa1 是这样的:

create procedure sp_qa1
begin
declare @a int
end

此错误正在返回:

消息 208,级别 16,状态 1,过程 sp_MSforeach_worker,第 102 行 [Batch Start Line 2] 无效的对象名称“#qtemp”。

我该如何解决这个问题?

【问题讨论】:

  • 看起来#qtemp 尚未在sp_MSforeach_worker 中创建。您可以从发生此错误的过程中发布代码吗?此外,您提供的代码中的任何地方都没有提到此过程。它是如何执行的?
  • sp_MSforeach_worker中的#qtemp表是系统过程,大家都有。这不是我创造的。
  • 原来如此,我很抱歉。

标签: sql-server stored-procedures sql-server-2008-r2 linked-server


【解决方案1】:

你的链接服务器的RPC和RPC OUT选项是TRUE吗?

另外,您可以直接执行代码,无需 openquery,如下所示:

EXEC [A].[database].[schema].sp_qa2

【讨论】:

  • 是的,他们是真的。我知道我可以通过提供整个 4 名称来执行它。我想做 OPENQUERY,因为它在性能方面更好
  • 您是否通过使用 4 部分名称执行同样的错误?
  • OPENQUERY 不支持多个结果集,而 SP_MSForEachDB 每个数据库返回一个结果集 - sqlservercentral.com/Forums/Topic1210374-1292-1.aspx
【解决方案2】:

你也可以试试:

EXEC(@sql) AT [RemoteServer]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2014-01-11
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多