usar tablas temporales en sql dinamico

Caso: Se tiene una consulta SQL que se genera dinamicamente, se quiere volcar el conjunto de resultados en una tabla temporal. Se tuvo que realizar lo siguiente:


ALTER PROCEDURE [dbo].[SPS_GeneraRptPedidoDetalle]    
    @docFechaInicio [date],
    @docFechaFin [date],
    @codCliente [int],
    @sucursal [char](4),
    @ordenCompra [char](15),
    @fAprobInicio [date],
    @fAprobFin [date],
    @vendedor [int],
    @item [char](15),
    @nroDoc [char](14),
    @linea [char](6),
    @familia [char](6),
    @subfamilia [char](6)
AS
BEGIN

    DECLARE @cadenaTotal [nvarchar](max)
    DECLARE @cadenaSql [varchar](MAX)
    DECLARE @cadenaWhere [nvarchar](MAX)
    DECLARE @cadenaOrderBy [varchar](200)
    DECLARE @cadenaGroupBy [varchar](MAX)
    
    SET @cadenaTotal=N''
    SET @cadenaWhere=N''                 
    
    SET @cadenaSql='SELECT   
             t2.ClienteReferencia,
             t2.ClienteNumero,
             t2.ClienteNombre,
             t1.NumeroDocumento,
             t1.TipoDetalle,
             t1.Linea as LineaDoc,
             [t10].[DescripcionLocal] as Marca,
             t1.ItemCodigo,
             t1.Descripcion,
             t1.UnidadCodigo,
             t1.CantidadPedida,
             t1.Monto,
             t1.DocumentoRelacNumeroDocumento,
             t1.DocumentoRelacLinea,
             t1.ExportacionMarcaPaquete,             
             t2.MonedaDocumento,
             [t9].[DescripcionCorta] AS GlosaMoneda,
             t1.Estado,
             t2.Vendedor,
             [t8].[NombreCompleto] AS AsesorComercial,
             t1.IGVExoneradoFlag,
             t2.Criteria,
             t2.FechaDocumento,
             t2.FechaAprobacion,
             t1.UnidadCodigoDoble,
             t1.CantidadPedidaDoble,
             t2.Comentarios,
             t1.DocumentoRelacTipoDocumento,
             t1.TipoDocumento,
             t1.Lote,
             t1.CantidadEntregada,
             t1.PrecioUnitario,
             t1.AlmacenCodigo,
             t1.Condicion,
             t1.PorcentajeDescuento01,
             t1.PorcentajeDescuento02,
             t1.PorcentajeDescuento03,
             t1.TransferenciaGratuitaFlag,
             t1.PrecioUnitarioGratuito,
             t1.PrecioUnitarioOriginal,
             t1.MontoFinal,
             t1.PrecioUnitarioFinal,
             t2.NumeroInterno,             
             t1.NumeroSerie,
             t2.CentroCosto,
             t3.Linea as LineaItem,
             t3.Familia,
             t3.SubFamilia,
             t3.NumeroDeParte,
             t3.ItemProcedencia,
             t1.ExportacionFechaProgramacion,
             t1.exportacioncomentarios,
             t2.ClienteRUC,
             t2.RequisicionNumero,
             t4.StockActual AS StockActual,
             t4.StockActual - ISNULL(t4.StockComprometido, 0) AS StockDisponible,
             t4.StockComprometido AS StockComprometido,
             t5.StockProceso,
             t6.FechaPrometida,
             t7.ClasificacionRotacion,
             [t2].[ClienteReferencia] AS NroOC,
             (sum(t1.[CantidadPedida] - [t1].[CantidadEntregada])*t1.[PrecioUnitario]) AS Valorizado,
             (sum(t1.[CantidadPedida] - [t1].[CantidadEntregada])*t1.[PrecioUnitario]*(CASE t2.[MonedaDocumento] WHEN ' + char(39) +  'LO' + char(39) + ' THEN (1/[t2].[TipodeCambio]) ELSE 1 END )) AS ValorizadoCambio        
    INTO #tmpTemporal             
    FROM     spring.[dbo].CO_DocumentoDetalle t1
             INNER JOIN spring.[dbo].CO_Documento t2 ON (t2.CompaniaSocio = t1.CompaniaSocio)
                AND (t2.TipoDocumento = t1.TipoDocumento)
                AND (t2.NumeroDocumento = t1.NumeroDocumento)
             LEFT OUTER JOIN spring.[dbo].WH_ItemMast t3 ON t1.ItemCodigo = t3.Item
             LEFT OUTER JOIN spring.[dbo].VW_WH_ItemAlmacenStock t4 ON t1.ItemCodigo = t4.Item
                AND t1.AlmacenCodigo = t4.AlmacenCodigo
             LEFT OUTER JOIN spring.[dbo].VW_WH_ItemComprasEnProceso t5 ON t5.Item = t1.ItemCodigo
                AND t5.Companiasocio = t1.Companiasocio
             LEFT OUTER JOIN spring.[dbo].VW_WH_ItemComprasEnProcesoFecha t6 ON t6.Item = t1.ItemCodigo
                AND t6.Companiasocio = t1.Companiasocio
             LEFT OUTER JOIN spring.[dbo].WH_ItemAlmacen t7 ON t7.AlmacenCodigo = t2.AlmacenCodigo
                AND t7.Item = t1.ItemCodigo
                AND t7.Condicion = ' + char(39) + '0' + char(39) + '
             LEFT OUTER JOIN [Spring].[dbo].[PersonaMast] t8 ON t8.[Persona]=[t2].[Vendedor]
             LEFT OUTER JOIN [spring].[dbo].[MonedaMast] t9 ON t9.[MonedaCodigo]=[t2].[MonedaDocumento]
             LEFT OUTER JOIN [Spring].[dbo].[WH_Marcas] t10 ON t10.[MarcaCodigo]=[t3].[MarcaCodigo]
    WHERE    (t1.TipoDocumento = ' + char(39) + 'PE' + char(39) + ')
             AND (t1.Estado = ' + char(39) + 'PR' + char(39) + ')
             AND t1.CantidadPedida > t1.CantidadEntregada
             AND t2.Estado = ' + char(39) + 'AP' + char(39) + '
             AND (t2.CompaniaSocio = ' + char(39) + '01000000' +  char(39) + ')                          
             AND (t2.FormaFacturacion <> ' + char(39) + 'GF' + char(39) + ')
             AND (t2.TipoVenta <> ' + char(39) + 'SEP' + char(39) + ')' + 
             ' AND (CAST(t2.FechaDocumento AS date) BETWEEN @docFechaInicio AND @docFechaFin)'

    
                 
    IF @codCliente<> 0 BEGIN
        SET @cadenaWhere= @cadenaWhere + N' AND [t2].[ClienteNumero]=@codCliente'    
    END 
    
    IF @sucursal<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t2].[Sucursal]=@sucursal'
    END 
    
    IF @ordenCompra<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t2].[ClienteReferencia]=@ordenCompra'
    END 
    
    IF YEAR(@fAprobInicio)<>1900 AND YEAR(@fAprobFin)<>1900 BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND CAST(ISNULL([t2].[FechaAprobacion],' + char(39) + '19000101' + char(39) + ') AS date) BETWEEN @fAprobInicio AND @fAprobFin'
    END 

    IF @vendedor<>0 BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t2].[Vendedor]=@vendedor'
    END 
    
    IF @item<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t1].[ItemCodigo]=@item'
    END 
    
    IF @nroDoc<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t1].[NumeroDocumento]=@nroDoc'
    END 
    
    IF @linea<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t3].[Linea]@linea'
    END 
    
    IF @familia<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t3].[Familia]=@familia'
    END 
    
    IF @subfamilia<>'0' BEGIN
        SET @cadenaWhere=@cadenaWhere + N' AND [t3].[SubFamilia]=@subfamilia'
    END     
    
    SET @cadenaGroupBy=N' GROUP BY   
             t1.NumeroDocumento,
             t1.TipoDetalle,
             t1.Linea,
             [t10].[DescripcionLocal],
             t1.ItemCodigo,
             t1.Descripcion,
             t1.UnidadCodigo,
             t1.CantidadPedida,
             t1.Monto,
             t1.DocumentoRelacNumeroDocumento,
             t1.DocumentoRelacLinea,
             t1.ExportacionMarcaPaquete,
             t2.ClienteNumero,
             t2.ClienteNombre,
             t2.MonedaDocumento,
             [t9].[DescripcionCorta],
             t1.Estado,
             t2.Vendedor,
             [t8].[NombreCompleto],
             t1.IGVExoneradoFlag,
             t2.Criteria,
             t2.FechaDocumento,
             t2.FechaAprobacion,
             t1.UnidadCodigoDoble,
             t1.CantidadPedidaDoble,
             t2.Comentarios,
             t1.DocumentoRelacTipoDocumento,
             t1.TipoDocumento,
             t1.Lote,
             t1.CantidadEntregada,
             t1.PrecioUnitario,
             t1.AlmacenCodigo,
             t1.Condicion,
             t1.PorcentajeDescuento01,
             t1.PorcentajeDescuento02,
             t1.PorcentajeDescuento03,
             t1.TransferenciaGratuitaFlag,
             t1.PrecioUnitarioGratuito,
             t1.PrecioUnitarioOriginal,
             t1.MontoFinal,
             t1.PrecioUnitarioFinal,
             t2.NumeroInterno,
             t2.ClienteReferencia,
             t1.NumeroSerie,
             t2.CentroCosto,
             t3.Linea,
             t3.Familia,
             t3.SubFamilia,
             t3.NumeroDeParte,
             t3.ItemProcedencia,
             t1.ExportacionFechaProgramacion,
             t1.exportacioncomentarios,
             t2.ClienteRUC,
             t2.RequisicionNumero,
             t4.StockActual,
             t4.StockComprometido,
             t5.StockProceso,
             t6.FechaPrometida,
             t7.ClasificacionRotacion,
             [t2].[ClienteReferencia],
             t2.[TipodeCambio]'
    
    SET @cadenaOrderBy=' ORDER BY t2.FechaDocumento ASC
           , [t2].[ClienteNombre] ASC          
           , t1.NumeroDocumento ASC
           , t1.Linea ASC
           , t2.MonedaDocumento ASC;'

    DECLARE @sqlTemporal [varchar](500)
    
    SET @sqlTemporal='SELECT *, (SELECT SUM(t2.Monto) FROM #tmpTemporal t2 WHERE ISNULL(t2.ClienteReferencia,' + char(39) + char(39) + ')=ISNULL(t1.ClienteReferencia,' + char(39) + char(39) + ') AND t2.ClienteNumero=t1.ClienteNumero) AS MontoTotal
    FROM #tmpTemporal t1;
    
    DROP TABLE #tmpTemporal;'


    SET @cadenaTotal=@cadenaSql+ @cadenaWhere + @cadenaGroupBy + @cadenaOrderBy + @sqlTemporal
    
        
    EXEC sp_executesql @cadenaTotal, N'@docFechaInicio [date], @docFechaFin [date], @codCliente [int], @sucursal [char](4)
    , @ordenCompra [char](15), @fAprobInicio [date], @fAprobFin [date], @vendedor [int], @item [char](15), @nroDoc [char](14)
    , @linea [char](6), @familia [char](6), @subfamilia [char](6)'
    , @docFechaInicio, @docFechaFin, @codCliente, @sucursal
    , @ordenCompra, @fAprobInicio, @fAprobFin, @vendedor, @item, @nroDoc
    , @linea, @familia, @subfamilia


    

END 

GO 
  

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *