SQL Server Performance

Borrado de tablas temporales

Discussion in 'Preguntas sobre SQL Server en Español.' started by eltriki, Sep 21, 2006.

  1. eltriki New Member

    Buenas a tod@s,

    Necesitaria que me echaseis una cable con un Procedimiento almacenado para poder borrar todas las tablas temporales de una base de datos, lo tengo montado de tal forma que todas las tablas q se generan temporales de la BBDD empizan por TMP% mi problema surge cuando intento meter en un bucle una sentencia SQL como drop table @nombretabla..

    os paso el store procedure a ver si me podeis echar un cable


    CREATE PROCEDURE BORRAR_TMP
    AS
    SELECT NAME INTO BORRAR FROM SYSOBJECT
    WHERE NAME LIKE 'tmp%' AND XTYPE = 'U';
    DECLARE @NTABLA
    SET @NTABLA = BORRAR.NAME
    WHILE IF @NTABLA = NOTnull
    BEGIN
    DROP TABLE @NTABLA
    RETURN (1);
    END IF
    ELSE
    RETURN(0);
    END


    ES UNA IDEA NO ESTA PROBADA SI PODEIS AYUDARME OS AGRADECERIA..

    UN SALUDO
    [?]
  2. Luis Martin Moderator

    Hay varios problemas de acuerdo a lo que veo:
    BORRAR no está declarada.
    DECLARE @NTABLA le falta el tipo de variable, por ejemplo "as char(25)" o lo que corresponda.

    Por lo tanto lo que sugiero es que con el Administrador coorporativo expandas tu base de datos y las borres directamente allí.

    Otra sugerencia es que normalizes la tablas temporarias, esto es que en código comiencen con #NombreTabla.
    De esta forma si no la borras por programa (que sería lo ideal), estas tablas se generan en tempdb, por lo tanto al bajar el servicio de SQl se borran automáticamente.




    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All in Love is Fair
    Stevie Wonder


    All postings are provided “AS IS” with no warranties for accuracy.



  3. eltriki New Member

    Buenas Luis

    A ver te cuento el tema de borrar por programa ; es porque estas tablas temporales no las genero yo las genera usuarios que lanzan consultas de millones de registro pero dejan la basurilla en la base de datos. para quitar espacio hemos optado por generar un procedimiento que todos los viernes a las 7pm se borren todas las tablas q inicien por 'TMP_' es por ello que necesito generarlo asi sino tendria que estar a las 7pm borrando las tablas.. jejejeje

    mi pregunta mas concreta que resolveria mis dudas es si a la sentencia "drop table" le puedo pasar un valor que antes lo eh metido en una variable.

    drop table @ntable <--- por ejmplo.

    gracias y hasta pronto

    P.D. la anterior sentencia lo que realiza el valor BORRAR es meter el resultado de la select en una tabla que se llama BORRAR y luego recorrer esta tabla con lo nombres eh ir borrando una a una hasta que el valor de ese camop sea NULL.
  4. Luis Martin Moderator

    No se puede asignar una variable a la sentencia DROP.

    Una forma de hacerlo es la siguiente:

    declare @nombre as char (50)
    declare @borrar as nchar (50)
    set @nombre = 'prueba'

    set @borrar = 'drop table' + ' ' + @nombre

    EXECUTE sp_executesql @borrar

    Con esta idea tendrías que poder resolver el problema.

    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All in Love is Fair
    Stevie Wonder


    All postings are provided “AS IS” with no warranties for accuracy.



  5. eltriki New Member

    Gracias Luis al final es lo que hice. os pego el Procedimiento para quien lo necesite;
    Primero genero un arrays con las tablas a borrar:

    IF OBJECT_ID ( 'crea_array_tmp', 'P' ) IS NOT NULL
    drop procedure crea_array_tmp;
    create procedure CREA_ARRAY_ZZ
    AS
    select name into papelera from sysobjects
    where name like 'tmp%' and xtype = 'U'
    --Print 'CREACION CORRECTA'
    return(0)
    GO

    LUEGO, creamos el procedimiento para borrar todas las tablas.. desde ese arrays.

    CREATE PROCEDURE RECORRE_LIMPIA
    AS
    declare @variable nvarchar(256), @ntabla char(256), @row char(6)
    set @row = (select count(*) from papelera)
    select @row
    while @row > 0
    Begin
    set @ntabla = (select top 1 name from papelera)
    set @variable = 'DROP TABLE ' + @ntabla
    exec(@variable)
    select @ntabla
    set @row=@row-1
    delete from papelera where name = @ntabla
    **comprobacion de la tabla borrada.
    select @ntabla
    end


    ESPERO os sirva de algo a mi me funciona perfectamente.

    Gracias y hasta pronto
    go
  6. Luis Martin Moderator

    Gracias por compartirlo.


    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All in Love is Fair
    Stevie Wonder


    All postings are provided “AS IS” with no warranties for accuracy.



Share This Page