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'
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
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.
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 :)
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!
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.