En algunos casos con SQL Server, puede haber una instancia en la que desee tomar los datos resultantes de un procedimiento almacenado e insertarlos en una tabla temporal para utilizarlos en otra consulta. Determinar cómo llevar a cabo esta tarea puede ser algo difícil, por lo que esbozaremos brevemente un par de opciones, dependiendo de sus necesidades específicas y de la configuración de la base de datos.
Antes de examinar los métodos específicos, vamos a crear un procedimiento de ejemplo. Aunque no es especialmente útil, vamos a crear el procedimiento BooksByPrimaryAuthor
, que acepta el parámetro @PrimaryAuthor
y coge los registros de nuestra tabla books
en los que coincida ese @PrimaryAuthor
. La sentencia de generación del procedimiento podría ser así:
CREATE PROC BooksByPrimaryAuthor @PrimaryAuthor nvarchar(100)ASBEGIN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;ENDGO
En realidad, lo que nos gustaría hacer es algo así, donde SELECT
los datos resultantes de nuestro procedimiento y los insertamos en una tabla temporal:
SELECT *INTO #tmpSortedBooksFROM EXEC BooksByPrimaryAuthor 'Tolkien'
El problema es que la sintaxis anterior es inadecuada y no funcionará. Necesitamos un nuevo método.
Usando la sentencia OPENROWSET
Una posibilidad es utilizar la sentencia OPENROWSET
, que permite acceder a datos remotos desde una fuente OLE DB y puede ser ejecutada directamente desde dentro de otra sentencia SQL. OPENROWSET
es un método de conexión y recuperación de datos de una sola vez, por lo que no debe utilizarse para conexiones frecuentes (en ese caso es preferible enlazar servidores).
OPENROWSET
puede ser el objetivo de cualquier sentencia INSERT
DELETE
, o UPDATE
, lo que lo hace ideal para nuestros propósitos de «ejecutar» nuestro procedimiento almacenado por nosotros y extraer esos datos de vuelta a nuestra tabla temporal en espera.
Antes de utilizar OPENROWSET
, puede ser necesario modificar algunas opciones de configuración, concretamente permitiendo el acceso ad hoc. Esto se puede configurar mediante las siguientes sentencias:
sp_configure 'Show Advanced Options', 1GORECONFIGUREGOsp_configure 'Ad Hoc Distributed Queries', 1GORECONFIGUREGO
Ahora podemos utilizar OPENROWSET
, que tiene una sintaxis particular que hay que respetar:
OPENROWSET( <PROVIDER_NAME>, <DATA_SOURCE>, <OPTIONS>)
Así, podemos ejecutar nuestro procedimiento almacenado a través de OPENROWSET
y pasarlo a nuestra tabla temporal así:
Es posible que tengas que cambiar los valores de PROVIDER_NAME
y DATA_SOURCE
para tus propios fines.
Usando una función definida por el usuario
El método OPENROWSET
tiene algunas desventajas, a saber, que requiere permisos/configuración ad hoc como vimos anteriormente, y además OPENROWSET
sólo es capaz de devolver un único conjunto de resultados (si se proporcionan varios conjuntos, sólo se devuelve el primero).
Por lo tanto, otro método para realizar esta tarea es reemplazar efectivamente el procedimiento almacenado con una función definida por el usuario en su lugar.
Desde nuestro ejemplo, esto se vería algo así:
CREATE FUNCTION BooksByPrimaryAuthor( @PrimaryAuthor nvarchar(100))RETURNS TABLEASRETURN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;GO
Esta función puede entonces ser utilizada aproximadamente de la misma manera que la deseada anteriormente usando OPENROWSET
:
SELECT *INTO #tmpSortedBooksFROM BooksByPrimaryAuthor('Tolkien')
En el caso de que realmente necesite un procedimiento almacenado, también puede envolver su función dentro de un procedimiento almacenado también.
0 comentarios