sql >> Base de Datos >  >> RDS >> Sqlserver

El uso de OPENQUERY (procedimiento almacenado exec) para crear una nueva tabla temporal falla con el error 11526

Prueba esto:

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

La razón de esto es que cuando ejecuta un procedimiento almacenado en un servidor vinculado, el proveedor primero intenta determinar la forma del conjunto de filas resultante. Lo hace emitiendo SET FMTONLY ON; y luego ejecutar su declaración. En un procedimiento almacenado que no usa tablas temporales, esto funciona muy bien. El analizador de consultas básicamente realiza una ejecución en seco sin obtener realmente todos los datos, solo los metadatos (algo así como mostrar un plan de ejecución estimado).

El problema es que cuando el procedimiento almacenado lo hace use tablas temporales, falla, porque los metadatos de la tabla temporal no existen:no se pueden recopilar a través del metanálisis que funciona para procedimientos almacenados que no usan tablas temporales. La cura, entonces, es manualmente SET FMTONLY OFF; dentro del lote que está ejecutando el procedimiento almacenado.

Tenga en cuenta que el uso de este método hará que el procedimiento almacenado se ejecute dos veces . La primera vez para recopilar los metadatos (los datos se descartan) y la segunda vez para devolver los datos. Si el procedimiento almacenado llamado es particularmente costoso o tiene efectos secundarios, es posible que deba hacer concesiones.

Finalmente, tenga en cuenta que este truco no funciona en todos los procedimientos almacenados. Hay cosas que los procedimientos almacenados pueden hacer que simplemente arrojan una llave inglesa en las obras. No conozco todas las posibilidades, pero una de ellas es devolver varios conjuntos de registros.

En respuesta a su actualización de que SET FMTONLY OFF no funciona:¿puede reestructurar su SP para que no use una tabla temporal o para usar una tabla permanente con clave de sesión? Cualquiera de estas opciones podría hacer el trabajo. En SQL Server 2012, también tiene la opción de pasar datos con table- parámetros valiosos .

Es posible que desee leer Cómo compartir datos entre procedimientos almacenados de Erland Sommarskog. ya que podría brindarle inspiración para lograr su propósito.