Pregunta Insertar resultados de un procedimiento almacenado en una tabla temporal


¿Cómo hago un SELECT * INTO [temp table] FROM [stored procedure]? No FROM [Table] y sin definir [temp table]?

Select todos los datos de BusinessLine dentro tmpBusLine funciona bien.

select *
into tmpBusLine
from BusinessLine

Estoy intentando lo mismo, pero usando un stored procedure que devuelve datos, no es lo mismo.

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

Mensaje de salida:

Msg 156, nivel 15, estado 1, línea 2   Sintaxis incorrecta cerca de la palabra clave   'ejecutivo'.

He leído varios ejemplos de cómo crear una tabla temporal con la misma estructura que el procedimiento almacenado de salida, que funciona bien, pero sería bueno no proporcionar ninguna columna.


1336
2018-03-17 10:45


origen


Respuestas:


Puedes usar OPENROWSET para esto. Echar un vistazo. También incluí el código sp_configure para habilitar Consultas distribuidas ad hoc, en caso de que no esté ya habilitado.

CREATE PROC getBusinessLineHistory
AS
BEGIN
    SELECT * FROM sys.databases
END
GO

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC getBusinessLineHistory')

SELECT * FROM #MyTempTable

619
2017-08-04 15:27



Si desea hacerlo sin declarar primero la tabla temporal, puede intentar crear una función definida por el usuario en lugar de una procedimiento almacenado y hacer que esa función definida por el usuario devuelva una tabla. Alternativamente, si quiere usar el procedimiento almacenado, intente algo como esto:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

517
2018-03-17 14:08



En SQL Server 2005 puede usar INSERT INTO ... EXEC para insertar el resultado de un procedimiento almacenado en una tabla. De MSDN INSERT documentación (para SQL Server 2000, de hecho):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

267
2018-03-17 10:50



Esta es una respuesta a una versión ligeramente modificada de su pregunta. Si puede abandonar el uso de un procedimiento almacenado para una función definida por el usuario, puede usar una función en línea definida por el usuario con valores de tabla. Esto es esencialmente un procedimiento almacenado (tomará los parámetros) que devuelve una tabla como un conjunto de resultados; y por lo tanto se colocará muy bien con una declaración INTO.

Aquí hay un buen artículo rápido en él y otras funciones definidas por el usuario. Si aún tiene una necesidad de manejo para un procedimiento almacenado, puede ajustar la función definida por el usuario con valores de tabla en línea con un procedimiento almacenado. El procedimiento almacenado pasa parámetros cuando llama a seleccionar * desde la función definida por el usuario en la tabla en línea.

Entonces, por ejemplo, tendría una función definida por el usuario en la tabla en línea para obtener una lista de clientes para una región en particular:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

A continuación, puede llamar a esta función para obtener sus resultados:

SELECT * FROM CustomersbyRegion(1)

O para hacer un SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Si aún necesita un procedimiento almacenado, ajuste la función como tal:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

Creo que este es el método más "sin hackeo" para obtener los resultados deseados. Utiliza las funciones existentes ya que estaban destinadas a ser utilizadas sin complicaciones adicionales. Al anidar la función definida por el usuario con valores de tabla en línea en el procedimiento almacenado, tiene acceso a la funcionalidad de dos maneras. ¡Más! Solo tiene un punto de mantenimiento para el código SQL actual.

Se ha sugerido el uso de OPENROWSET, pero esto no es para lo que se pretendía utilizar la función OPENROWSET (de Books Online):

Incluye toda la información de conexión   eso es requerido para acceder a datos remotos   desde una fuente de datos OLE DB. Esta   método es una alternativa para acceder   tablas en un servidor vinculado y es una   único método ad hoc de conexión   y accediendo a datos remotos usando OLE   DB. Para referencias más frecuentes a   Fuentes de datos OLE DB, use enlaces   servidores en su lugar.

El uso de OPENROWSET hará el trabajo, pero incurrirá en una sobrecarga adicional para abrir las conexiones locales y organizar los datos. También puede no ser una opción en todos los casos, ya que requiere un permiso de consulta ad hoc que representa un riesgo de seguridad y, por lo tanto, puede no ser deseado. Además, el enfoque OPENROWSET impedirá el uso de procedimientos almacenados que devuelvan más de un conjunto de resultados. Envolver varias funciones definidas por el usuario de valor de tabla en línea en un solo procedimiento almacenado puede lograr esto.


166
2017-08-04 17:11



SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC test.dbo.prc_test 1')

100
2018-03-17 10:50



La solución más fácil:

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

Si no conoce el esquema, puede hacer lo siguiente. Por favor tenga en cuenta que existen riesgos de seguridad graves en este método.

SELECT * 
INTO #temp
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'EXEC [db].[schema].[sproc]')

90
2018-03-13 19:38



Cuando el procedimiento almacenado devuelve muchas columnas y no desea "crear" manualmente una tabla temporal para contener el resultado, he encontrado que la manera más fácil es ir al procedimiento almacenado y agregar una cláusula "into" en el última instrucción de selección y agregue 1 = 0 a la cláusula where.

Ejecute el procedimiento almacenado una vez y retroceda y elimine el código SQL que acaba de agregar. Ahora, tendrá una tabla vacía que coincida con el resultado del procedimiento almacenado. Puede "crear una tabla de script como crear" para una tabla temporal o simplemente insertar directamente en esa tabla.


80
2018-03-17 14:06