es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear tabla temporal desde SQL dinámico con parámetros.

Aquí está mi problema. Necesito crear una tabla temporal después de ejecutar SQL dinámico y pasar parámetros de la siguiente manera:

CREATE PROCEDURE SP1
    @param1 varchar(50),
    @param2 varchar(50)
AS
BEGIN
    DECLARE @PDef varchar(300)
    DECLARE @sql  varchar(300)
    DECLARE @localparam1 varchar(300)
    DECLARE @localparam2 varchar(300)

    SET @localparam1 = ....
    SET @localparam2 = ....

    SET @PDef = '@param1 varchar(50), @localparam1 varchar(300)'

    SET @sql = 'SELECT * FROM TABL1 WHERE COL1 = @param1, COL2 in (@localparam1)'

    EXEC sp_Executesql @sql, @PDef, 
                            @param1 = @param1, @localparam1 = @localparam1

El código anterior funciona. ¿Cómo obtengo los resultados en una tabla temporal?

He intentado:

CREATE TABLE #T1 (col1 varchar(50), col2 varchar(50) )

INSERT INTO #T1 
    EXECUTE @sql    -- no funcionó

INSERT INTO #T1 
    EXECUTE (@sql, @PDef, @param1 = @param1, @localparam1 = @localparam1)   -- tampoco funcionó

EDICIÓN: Había revisado los siguientes ejemplos al usar EXECUTE
https://stackoverflow.com/questions/662049/dynamic-sql-results-into-temp-table-in-sql-stored-procedure y por eso usé EXECUTE
La respuesta aceptada fue:
INSERT INTO #T1 execute (‘execute ‘ + @SQLString)
omitir el ‘execute’ si la cadena SQL es algo distinto a un procedimiento

Ahora ve los comentarios de esa respuesta aceptada en esa pregunta 🙂

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener los resultados de la consulta SQL dinámica en una tabla temporal, un enfoque es modificar la variable @sql para incluir una cláusula INTO que especifique el nombre de la tabla temporal. Por ejemplo:

    SET @sql = 'SELECT * INTO #T1 FROM TABL1 WHERE COL1 = @param1 AND COL2 IN (' + @localparam1 + ')'
    

    Luego, después de ejecutar el SQL dinámico con sp_executesql, simplemente puedes seleccionar el contenido de la tabla temporal:

    SELECT * FROM #T1
    

Comments are closed.