web-dev-qa-db-fra.com

Erreur "La préparation différée n'a pas pu être terminée" lors de l'utilisation de la base de données locale en tant que serveur lié

J'ai créé un serveur lié à partir de mon serveur SQL local, comme indiqué dans

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

Cependant, lorsque j'essaie d'exécuter une procédure stockée dans le serveur lié, il génère:

Deferred prepare could not be completed

erreur et nom d'objet non valide 'nom de table'

14
Anand B

Avez-vous oublié quelque chose dans le nom de votre objet? Il devrait toujours ressembler à Database.User.ObjectName (Northwind.dbo.Customers, par exemple). 

Donnez le nom complet de l'objet lors de l'exécution de requêtes via des serveurs liés. 

Query for Stored Procedure peut ressembler à ceci lors de l'exécution sur des serveurs liés: 

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

Vérifiez avec des options comme SET FMTONLY OFF lors de l'exécution de la procédure stockée. 

Suivez ce lien pour OPENQUERY: http://msdn.Microsoft.com/en-us/library/ms188427.aspx

11
Vishal Vaishya

Même si vous avez mal nommé une colonne dans votre requête, vous verrez cette erreur. Exemple:

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

et le nom de la colonne est column, pas colunm.

La ligne du bas est de vérifier l'exactitude de la requête à envoyer au serveur distant, puis de l'envelopper dans openquery et de le tester à nouveau.

4
ajeh

Même problème pour moi: je l'ai résolu en corrigeant simplement l'objet "cible", qui n'a pas été nommé correctement. 

Dans mon cas, je cherchais la table [testDb].[Business.Customer], mais le nom correct était [testDb].[Business].[Customer]... même erreur que la votre:

Il fournisseur OLE DB "SQLNCLI10" par serveur collegato "RIBOWEB10\SQLEXPRESS" a été restauré dans le message "La préparation différée N'a pas pu être terminée.".

Je pense que SQL Server essaie de résoudre dynamiquement les noms qui ne correspondent pas directement à des objets réels, mais pas sûr de cela.

Assez facile, j'espère que ça aide :)

1
MAXE

J'ai eu la même erreur en essayant d'interroger via un serveur lié. Cependant, je demandais une vue sur le serveur cible, pas une procédure stockée.

La vue du serveur cible a été créée comme suit:

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

Pour résoudre le problème, j'ai créé une autre vue et encapsulé les deux instructions UNION dans une sous-requête, comme suit:

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

Doit être un problème de métadonnées avec la vue originale. 

J'espère que cela vous aide!

1
user3377487

J'ai eu le même problème, le problème que j'avais était que l'utilisateur spécifié dans la connexion au serveur lié n'avait pas accès à la base de données à laquelle j'essayais d'accéder.

0
ASindleMouat