25

我从本地 Sql Server 创建了一个链接服务器,如

http://sqlserverplanet.com/dba/local-linked-server

但是,当我尝试在链接服务器中执行存储过程时,它会抛出:

Deferred prepare could not be completed

错误和无效的对象名称“表名”

4

5 回答 5

20

您是否遗漏了对象名称中的某些内容。它应该总是像 Database.User.ObjectName(例如 Northwind.dbo.Customers)

通过链接服务器运行查询时提供完整的对象名称。

在链接服务器上执行时,查询存储过程可能是这样的:

Select  *
From    OPENQUERY([COM2\SQLEXPRESS], 'Exec Northwind.dbo.CustOrderHist ''CUST1''') as TB1

执行存储过程时检查 SET FMTONLY OFF 等选项。

按照此链接进行 OPENQUERY:http: //msdn.microsoft.com/en-us/library/ms188427.aspx

于 2013-03-08T04:14:15.377 回答
6

即使您在查询中错误地命名了列,您也会看到此错误。例子:

select *
from openquery(
     lnksrv
    ,'select top 10 * from db.schema.table where colunm = 10'
)

并且列名是column,不是colunm

底线是首先检查要发送到远程服务器的实际查询的正确性,然后将其包装openquery并重新测试。

于 2016-05-11T17:16:32.557 回答
1

我在尝试通过链接服务器查询时遇到了同样的错误。但是,我查询的是目标服务器上的视图,而不是存储过程。

目标服务器的视图是这样创建的:

CREATE VIEW vABC AS
    SELECT ... FROM Table1
    UNION ALL
    SELECT ... FROM Table2

为了解决这个问题,我做了一个改变视图,并将两个 UNION 语句包装在一个子查询中,如下所示:

CREATE VIEW vABC AS
    SELECT * FROM (
        SELECT ... FROM Table1
        UNION ALL
        SELECT ... FROM Table2
    ) T

必须是原始视图的一些元数据问题。

希望这对你有帮助!

于 2014-03-06T16:13:20.860 回答
1

对我来说同样的问题:我解决了它只是修复了未正确命名的“目标”对象。

就我而言,我正在搜索[testDb].[Business.Customer]表格,但正确的名称是[testDb].[Business].[Customer]......与您的错误相同:

Il provider OLE DB "SQLNCLI10" per il server collegato "RIBOWEB10\SQLEXPRESS" ha restituito il messaggio "Deferred prepare could not be completed."。

我认为 SQL Server 尝试动态解析与真实对象不直接匹配的名称,但不确定。

很简单,我希望这会有所帮助:)

于 2014-04-28T12:14:22.153 回答
0

我有同样的问题,我遇到的问题是链接服务器连接中指定的用户无权访问我试图访问的数据库。

于 2019-02-19T15:22:38.457 回答