Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'utilisation d'OPENQUERY (procédure stockée exec) pour créer une nouvelle table temporaire échoue avec l'erreur 11526

Essayez ceci :

SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;

La raison en est que lorsque vous exécutez une procédure stockée sur un serveur lié, le fournisseur essaie d'abord de déterminer la forme de l'ensemble de lignes résultant. Il le fait en émettant SET FMTONLY ON; puis exécutez votre déclaration. Dans une procédure stockée qui n'utilise pas de tables temporaires, cela fonctionne à merveille. L'analyseur de requêtes effectue essentiellement un essai à vide sans réellement récupérer toutes les données, uniquement les métadonnées (un peu comme afficher un plan d'exécution estimé).

Le problème est que lorsque la procédure stockée fait utilisez des tables temporaires, cela échoue, car les métadonnées de la table temporaire n'existent pas :elles ne peuvent pas être collectées via la méta-analyse qui fonctionne pour les procédures stockées qui n'utilisent pas de tables temporaires. Le remède, alors, est de manuellement SET FMTONLY OFF; dans le lot qui exécute la procédure stockée.

Sachez que l'utilisation de cette méthode fera en sorte que la procédure stockée s'exécutera deux fois . La première fois pour collecter les métadonnées (les données étant supprimées) et la deuxième fois pour renvoyer les données. Si la procédure stockée appelée est particulièrement coûteuse ou a des effets secondaires, vous devrez peut-être faire des concessions.

Enfin, notez que cette astuce ne fonctionne pas sur toutes les procédures stockées. Il y a des choses que les procédures stockées peuvent faire qui ne font que jeter une clé dans les travaux. Je ne connais pas toutes les possibilités, mais l'une d'elles renvoie plusieurs jeux d'enregistrements.

En réponse à votre mise à jour que SET FMTONLY OFF ne fonctionne pas :pouvez-vous éventuellement restructurer votre SP pour ne pas utiliser de table temporaire ou pour utiliser une table permanente à clé de session ? L'une ou l'autre de ces options pourrait faire l'affaire. Dans SQL Server 2012, vous avez également la possibilité de transmettre des données avec table- paramètres valorisés .

Vous aimerez peut-être lire Comment partager des données entre des procédures stockées d'Erland Sommarskog car cela pourrait vous inspirer pour atteindre votre objectif.