none
YA HAY UN OBJETO LLAMADO ##TABLATEMPORAL EN LA BASE DE DATOS RRS feed

  • Pregunta

  • Hola, espero me puedan ayudar tengo el siguiente procedimiento almancenado el cual permite generar un reporte en excel el caso es que cuando varios usuarios estan generando el reporte aparecen una serie de errores que indican ya hay un objeto llamado ##rpttabla en la base de datos.

    QUISIERA SABER COMO PUEDO HACER PARA GENERAR UN NOMBRE DE TABLA TEMPORAL ALEATORIO CADA VEZ QUE SE EJECUTA EL PROCEDIMIENTO ?

     

    IF @Opt = 0 BEGIN


    IF OBJECT_ID('tempdb..##RptMayorD')  IS NOT NULL
    BEGIN DROP TABLE ##RptMayorD END

    --** COMPROBANTE AUTOMATICOS **--
    SELECT 
    Cuenta = D.Cuenta, 
    Descripcion=CAST('' AS VARCHAR(250)),
    Folio=CAST(A.Folio AS VARCHAR(20)), 
    Lote = CAST(A.IdLote AS VARCHAR(20)), 
    Comprobante = C.Comprobante,
    FechaContable= CONVERT(CHAR(10),F.FechaContable,103), 
    A.CodigoTransaccion, 
    ReferenciaNegocio =  C.ReferenciaNegocio, 
                OficinaTransaccion = D.OficinaContable,
    Nombre_Oficina=CAST('' AS VARCHAR(50)),
    MonedaTransaccion = c.MonedaTransaccion, 
    Cotizacion  = D.Cotizacion , 
    ValorDebito = D.ValorDebito, 
    ValorDebitoEquivalencia= D.valordebitoequivalencia,
    ValorCredito  =  D.ValorCredito, 
    ValorCreditoEquivalencia= D.ValorCreditoEquivalencia,
    Concepto=C.Concepto, 
    Observacion = CAST('' AS VARCHAR(150)),
    NroDocumento = CAST('' AS VARCHAR(15)), 
    Cliente = CAST('' AS VARCHAR(250)) ,
    a.Origen,  
    FechaTransaccion=CONVERT(CHAR(10),A.FechaTransaccion,103),
    Nombre = CAST('' AS VARCHAR(150)), 
    NombreCliente = CAST('' AS VARCHAR(150)), 
    a.IDFechaContable, 
    A.IDLote, 
    IDAsiento = C.IDAsiento,
    IDComprobante 
    INTO  ##RptMayorD
    FROM Contabilidad..Comprobante A  WITH (NOLOCK)
    INNER JOIN Contabilidad..FechaContable F  WITH (NOLOCK) on F.IdFechaContable = A.IdFechaContable
    INNER JOIN GeneradorContableHistorico..Asientohistorico C  WITH (NOLOCK) on a.IdLote = c.LoteContable 
    INNER JOIN GeneradorContableHistorico..AsientoDetalleHistorico D WITH (NOLOCK) on c.IdAsiento = d.IdAsiento 
    WHERE A.EsMayorizado = 1 And A.EsCuadrado = 1 And A.EsVigente = 1 AND A.Origen <> 'MANUAL'  AND
     A.Folio LIKE @Fecha + '%'
     AND D.cuenta LIKE @Cuenta + '%' 
         AND D.Moneda LIKE  @Moneda + '%'



    --** COMPROBANTE MANUALES **--
    INSERT INTO ##RptMayorD
    SELECT 
    Cuenta = B.Cuenta, 
    Descripcion=CAST('' AS VARCHAR(250)),
    Folio=CAST(A.Folio AS VARCHAR(20)), 
    Lote = CAST(A.IdLote AS VARCHAR(20)), 
    Comprobante = CAST('' AS VARCHAR(200)), 
    FechaContable=CONVERT(CHAR(10),F.FechaContable,103), 
    A.CodigoTransaccion, 
    ReferenciaNegocio = CAST('' AS VARCHAR(250)), 
                OficinaTransaccion = B.IDOficinaContable, 
    Nombre_Oficina=CAST('' AS VARCHAR(50)),
    MonedaTransaccion = B.Moneda, 
    Cotizacion  = B.ValorCotizacion , 
    ValorDebito =B.MontoDebito, 
    ValorDebitoEquivalencia= B.MontoDebitoEquivalencia,
    ValorCredito  = B.MontoCredito, 
    ValorCreditoEquivalencia = B.MontoCreditoEquivalencia,
    Concepto= CAST(A.Comentario.query(N'/Glosa/Comentario/text()') AS VARCHAR(8000)), 
    Observacion = CAST('' AS VARCHAR(150)),
    NroDocumento = CAST('' AS VARCHAR(15)), 
    Cliente = CAST('' AS VARCHAR(250)) ,
    a.Origen,  FechaTransaccion=CONVERT(CHAR(10),
    A.FechaTransaccion,103),
    Nombre = CAST('' AS VARCHAR(150)), 
    NombreCliente = CAST('' AS VARCHAR(150)), 
    A.IDFechaContable, 
    IDLote, 
    IDAsiento = 0,A.IDComprobante
    FROM Contabilidad..Comprobante A  WITH (NOLOCK)
    INNER JOIN Contabilidad..FechaContable F  WITH (NOLOCK) on F.IdFechaContable = A.IdFechaContable
            INNER JOIN Contabilidad..detallecomprobante B WITH (NOLOCK) on a.idcomprobante = b.idcomprobante 
    WHERE A.EsMayorizado = 1 And A.EsCuadrado = 1 And A.EsVigente = 1 AND A.Origen = 'MANUAL'  
    AND B.cuenta LIKE  @Cuenta + '%'  
    AND A.Folio like @Fecha + '%'
    AND B.Moneda  LIKE  @Moneda + '%'


    --> Actualizar Nombre de Oficina
    UPDATE C SET Nombre_Oficina = trx.Nombre
    FROM ##RptMayorD C  WITH (NOLOCK)
    Join Configuracion..Oficina trx  WITH (NOLOCK) on trx.idoficina = c.OficinaTransaccion

    --> Actualizar Descripcion de la Cuenta
    UPDATE C SET Descripcion = trx.Descripcion
    FROM ##RptMayorD C  WITH (NOLOCK)
    Join contabilidad..catalogocuenta trx  WITH (NOLOCK) on trx.cuenta = c.cuenta

    --> Actualizar Nombre y Numero de Documento desde cuenta cliente
    UPDATE C SET NombreCliente=Nombres, NroDocumento = Documento, Cliente=Nombres
    FROM ##RptMayorD C  WITH (NOLOCK)
    Join Cuenta..CuentaCliente Cred  WITH (NOLOCK) On Cred.NumeroCuenta = c.ReferenciaNegocio 
            Join Cliente..VW_Clientes Cli  WITH (NOLOCK) on Cred.IdCliente = Cli.IdCliente
    WHERE Origen <> 'MANUAL' 

    -->Actualizar Nombre y Numero de Documento desde credito
    UPDATE C SET NombreCliente=Nombres, NroDocumento = Documento, Cliente=Nombres
    FROM ##RptMayorD C  WITH (NOLOCK)
    Join Credito..Credito Cred  WITH (NOLOCK) On Cred.NumeroCredito = c.ReferenciaNegocio 
            Join Cliente..VW_Clientes Cli  WITH (NOLOCK) on Cred.IdCliente = Cli.IdCliente
    WHERE Origen <> 'MANUAL'  AND Cliente = ''


    --> Actualizar Nombres desde Transaccion
    UPDATE C SET Nombre=trx.Nombre, Observacion=trx.Observacion, NroDocumento = NumeroIdentificacion, Cliente = trx.Nombre
    FROM ##RptMayorD C  WITH (NOLOCK)
    Left  Join Caja..transaccion trx  WITH (NOLOCK) on trx.secuencial = c.ReferenciaNegocio 
    WHERE Origen <> 'MANUAL'  AND Cliente = ''

    UPDATE ##RptMayorD SET Nombre='' WHERE Nombre IS NULL
    UPDATE ##RptMayorD SET Observacion='' WHERE Observacion IS NULL
    UPDATE ##RptMayorD SET NombreCliente='' WHERE NombreCliente IS NULL
    UPDATE ##RptMayorD SET NroDocumento='' WHERE NroDocumento IS NULL
    UPDATE ##RptMayorD SET Cliente='' WHERE Cliente IS NULL

    UPDATE A SET Concepto = Concepto_A
    FROM ##RptMayorD A 
    JOIN (SELECT NumeroCuenta, ComprobanteCanal, B.IDCuentaCliente, 
    Concepto_A=Comentario + ' ' + ComentarioEstadoCuenta, FechaContable=CONVERT(CHAR(10),C.FEchaContable,103)
     FROM Cuenta..CuentaCliente B   WITH (NOLOCK)
     JOIN Cuenta..Transaccion C  WITH (NOLOCK) ON B.IDCuentaCliente = C.IDCuentaCliente  AND C.CodigoAtributo='ATRCRECASACOMER' 
     ) D
    ON A.ReferenciaNegocio = D.NumeroCuenta AND A.CodigoTransaccion='TRANSCTA' AND A.FEchaContable = D.FEchaContable AND ComprobanteCAnal = Comprobante 


    SELECT COUNT(*) N FROM ##RptMayorD

    END

    IF @Opt = 1 BEGIN
    SELECT Cuenta, Descripcion, Folio, Lote, Comprobante, FechaContable, CodigoTransaccion, ReferenciaNegocio,
      Cod_Oficina = OficinaTransaccion, Nombre_Oficina, Moneda = MonedaTransaccion, Cotizacion, ValorDebito,
      ValorDebitoEquivalencia, ValorCredito, ValorCreditoEquivalencia,
      Concepto, Observacion, NroDocumento, Cliente, Origen, FechaTransaccion
    FROM ##RptMayorD
    ORDER BY Folio
    END


    Cecilia

    jueves, 21 de septiembre de 2017 23:08

Respuestas

  • Ya encontré la Solución 


    declare @Cuenta Varchar(25),@Fecha Varchar(10),@Moneda Varchar(3),@User Varchar(20)
    Declare @NomTabla Varchar(60)
    SET @User = 'CUser'
    SET @Cuenta ='190106010105'
    SET @Fecha ='20170812'
    SET @Moneda = 'SOL'
    SET @NomTabla = '##RptMayorDetalle' + @User


     
     EXEC ('IF OBJECT_ID(''tempdb..'+ @nomtabla + ''')  IS NOT NULL BEGIN DROP TABLE '+ @nomtabla + ' END')

    --** COMPROBANTE AUTOMATICOS **--
    EXEC (' SELECT 
    Cuenta = D.Cuenta, 
    Descripcion=CAST('''' AS VARCHAR(250)),
    Folio=CAST(A.Folio AS VARCHAR(20)), 
    Lote = CAST(A.IdLote AS VARCHAR(20)), 
    Comprobante = C.Comprobante,
    FechaContable= CONVERT(CHAR(10),F.FechaContable,103), 
    A.CodigoTransaccion, 
    ReferenciaNegocio =  C.ReferenciaNegocio, 
                OficinaTransaccion = D.OficinaContable,
    Nombre_Oficina=CAST('''' AS VARCHAR(50)),
    MonedaTransaccion = c.MonedaTransaccion, 
    Cotizacion  = D.Cotizacion , 
    ValorDebito = D.ValorDebito, 
    ValorCredito  =  D.ValorCredito, 
    Concepto=C.Concepto, 
    Observacion = CAST('''' AS VARCHAR(150)),
    NroDocumento = CAST('''' AS VARCHAR(15)), 
    Cliente = CAST('''' AS VARCHAR(250)) ,
    a.Origen,  
    FechaTransaccion=CONVERT(CHAR(10),A.FechaTransaccion,103),
    Nombre = CAST('''' AS VARCHAR(150)), 
    NombreCliente = CAST('''' AS VARCHAR(150)), 
    a.IDFechaContable, 
    A.IDLote, 
    IDAsiento = C.IDAsiento,
    IDComprobante 
    INTO '+ @nomtabla +'
    FROM Contabilidad..Comprobante A  WITH (NOLOCK)
    INNER JOIN Contabilidad..FechaContable F  WITH (NOLOCK) on F.IdFechaContable = A.IdFechaContable
    INNER JOIN GeneradorContableHistorico..Asientohistorico C  WITH (NOLOCK) on a.IdLote = c.LoteContable 
    INNER JOIN GeneradorContableHistorico..AsientoDetalleHistorico D WITH (NOLOCK) on c.IdAsiento = d.IdAsiento 
    WHERE A.EsMayorizado = 1 And A.EsCuadrado = 1 And A.EsVigente = 1 AND A.Origen <> ''MANUAL''
    AND A.Folio LIKE'+ @Fecha +' + ''%''
     AND D.cuenta LIKE '+ @Cuenta +' + ''%''  
         AND D.Moneda LIKE  '+ @Moneda +' + ''%''')


    Cecilia

    • Marcado como respuesta cazita666 viernes, 22 de septiembre de 2017 18:10
    viernes, 22 de septiembre de 2017 18:10

Todas las respuestas

  • Hola.

    Al indicar ## estas usando temporales del tipo global, para el caso que mencionas no es necesario, utiliza tabla temporal local, es decir, con un solo #

    Saludos.

    Cristian.


    DBA SQL Server Santiago/Chile

    jueves, 21 de septiembre de 2017 23:59
  • Hola Gracias por tu ayuda , si lo he intentado pero no es posible me sale un error indicando que no se encontró el objeto porque cada opción dentro del procedimiento usa conexiones diferentes por eso necesito el ##

    Cecilia

    viernes, 22 de septiembre de 2017 1:06
  • Para generar un nombre aleatorio, podrías hacerlo de manera dinámica.

    Ejemplo:

    --Esto solo para la prueba del SELECT

    Create Table PRUEBA
    (
    ID INT
    )




    DECLARE @Tabla Sysname
    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @Numero INT
    Select @Numero = Rand()*1000000 + Rand()*1000000



    SET @Tabla='##RPT_' + CONVERT(VARCHAR,@Numero)

    SET @SQL='Select * INTO '+ @Tabla +' From PRUEBA'

    EXEC SP_EXECUTESQL @SQL

    Select @Tabla


    DBA SQL Server Santiago/Chile




    • Editado CMAPM viernes, 22 de septiembre de 2017 1:42
    viernes, 22 de septiembre de 2017 1:32
  • Que significa lo sgte?

    "cada opción dentro del procedimiento usa conexiones diferentes"

    Usar tablas temporales globales implica un riesgo ya que cualquier usuario conectado al servidor tendra acceso a esta y podra realizar insert/delete/update sobre esta tabla.

    Como indico CPAM, deberas usar sql dinamico pero eso traera consigo que tu codigo debera ser completamente dinamico.

    Podrias usar la funcion NEWID() y adjuntar el valor para crear el nombre de la tabla.

    select quotename('tbl_' + cast(newid() as varchar(128))) as tbl_name;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 22 de septiembre de 2017 12:47
  • Gracias, 

    esa es la idea que varias personas puedan hacer uso al mismo tiempo de estas tablas.


    Cecilia

    viernes, 22 de septiembre de 2017 18:09
  • Ya encontré la Solución 


    declare @Cuenta Varchar(25),@Fecha Varchar(10),@Moneda Varchar(3),@User Varchar(20)
    Declare @NomTabla Varchar(60)
    SET @User = 'CUser'
    SET @Cuenta ='190106010105'
    SET @Fecha ='20170812'
    SET @Moneda = 'SOL'
    SET @NomTabla = '##RptMayorDetalle' + @User


     
     EXEC ('IF OBJECT_ID(''tempdb..'+ @nomtabla + ''')  IS NOT NULL BEGIN DROP TABLE '+ @nomtabla + ' END')

    --** COMPROBANTE AUTOMATICOS **--
    EXEC (' SELECT 
    Cuenta = D.Cuenta, 
    Descripcion=CAST('''' AS VARCHAR(250)),
    Folio=CAST(A.Folio AS VARCHAR(20)), 
    Lote = CAST(A.IdLote AS VARCHAR(20)), 
    Comprobante = C.Comprobante,
    FechaContable= CONVERT(CHAR(10),F.FechaContable,103), 
    A.CodigoTransaccion, 
    ReferenciaNegocio =  C.ReferenciaNegocio, 
                OficinaTransaccion = D.OficinaContable,
    Nombre_Oficina=CAST('''' AS VARCHAR(50)),
    MonedaTransaccion = c.MonedaTransaccion, 
    Cotizacion  = D.Cotizacion , 
    ValorDebito = D.ValorDebito, 
    ValorCredito  =  D.ValorCredito, 
    Concepto=C.Concepto, 
    Observacion = CAST('''' AS VARCHAR(150)),
    NroDocumento = CAST('''' AS VARCHAR(15)), 
    Cliente = CAST('''' AS VARCHAR(250)) ,
    a.Origen,  
    FechaTransaccion=CONVERT(CHAR(10),A.FechaTransaccion,103),
    Nombre = CAST('''' AS VARCHAR(150)), 
    NombreCliente = CAST('''' AS VARCHAR(150)), 
    a.IDFechaContable, 
    A.IDLote, 
    IDAsiento = C.IDAsiento,
    IDComprobante 
    INTO '+ @nomtabla +'
    FROM Contabilidad..Comprobante A  WITH (NOLOCK)
    INNER JOIN Contabilidad..FechaContable F  WITH (NOLOCK) on F.IdFechaContable = A.IdFechaContable
    INNER JOIN GeneradorContableHistorico..Asientohistorico C  WITH (NOLOCK) on a.IdLote = c.LoteContable 
    INNER JOIN GeneradorContableHistorico..AsientoDetalleHistorico D WITH (NOLOCK) on c.IdAsiento = d.IdAsiento 
    WHERE A.EsMayorizado = 1 And A.EsCuadrado = 1 And A.EsVigente = 1 AND A.Origen <> ''MANUAL''
    AND A.Folio LIKE'+ @Fecha +' + ''%''
     AND D.cuenta LIKE '+ @Cuenta +' + ''%''  
         AND D.Moneda LIKE  '+ @Moneda +' + ''%''')


    Cecilia

    • Marcado como respuesta cazita666 viernes, 22 de septiembre de 2017 18:10
    viernes, 22 de septiembre de 2017 18:10