none
Exclusão de Tabela RRS feed

  • Pergunta

  • Pessoal, me tirem uma pequena dúvida. Tenho uma tabela que preciso excluir constante, porém o que quero criar um job com agendamento pra deletar de forma automatizada a mesma.

    Estava usando a consulta abaixo, mas não atendem minhas necessidades:

     exec sp_msforeachdb '
        USE Livraria
        --print ''>>>>> '' + db_name()
        IF (db_name() NOT IN (''master'', ''tempdb'', ''model'', ''msdb'') )
        BEGIN
            declare @name varchar(100)
            declare @xt char(2)
            declare @ssn sysname
            declare @ss nvarchar(1500)
            declare @dg INT
            set @dg = 1
            declare myC cursor for
                SELECT so.name, so.type, sc.name as ssn
                FROM sys.objects so
                INNER JOIN sys.sysusers su
                ON so.schema_id = su.uid
                INNER JOIN sys.schemas sc
                ON so.schema_id = sc.schema_id
                WHERE (so.name Like ''TMP_%'')
                AND so.Is_MS_Shipped = 0
                ORDER BY so.type, so.name
            open myC
            fetch next from myC into @name, @xt, @ssn
            while @@fetch_status = 0
            begin
                if @xt = ''U''
                begin
                set @ss = ''DROP TABLE '' + @ssn + ''.'' + @name
                if @dg = 1 print space(7) + @ss else exec (@ss)
                set @ss = '' ''
                end
            fetch next from myC into @name, @xt, @ssn
            end
            close myC
            deallocate myC
        END ' 
    Agradeço desde já!

    sexta-feira, 22 de novembro de 2013 20:36

Respostas

  • Olá Amigo.

    Utilize o sp_executesql, para executar o comando para você. Basta agora schedular em um job.

    use Teste
    go 
    declare @cmd nvarchar(4000)
    
    while exists (select 1
    from sys.sysobjects
    where name like 'TMP_%' and type = 'U')
    
    begin
    
    select top 1 @cmd = 'DROP TABLE '+name
    from sys.sysobjects
    where name like 'TMP_%' and type = 'U'
    
    exec sp_executesql @cmd
    
    end

    abraço.

    segunda-feira, 25 de novembro de 2013 12:17

Todas as Respostas

  • Jerfeson,

    O nome da tabela é sempre o mesmo?

    Você precisa realmente excluir esta tabela? Não seria somente o caso de realizar um Truncate para excluir os dados?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 22 de novembro de 2013 22:55
  • Olá Galvão, na verdade a tabela é criada por uma aplicação de relatório e que o prefixo é sempre "TMP_", por esse motivo que coloquei LIKE. O que de fato preciso é agendar um job pra rodar periodicamente, no qual exclua todas a tabelas que se iniciam com "TMP_" de um determinada base. Era mais ou menos isso queria chegar com a consulta. Não seria excluir os dados mais sim a tabela. Excluir os resultados desta consulta:

    select name 
    from sys.sysobjects 
    where name like 'TMP_%' and type = 'U'


    sábado, 23 de novembro de 2013 13:05
  • Por enquanto estou usando a consulta:

    use Teste
    select 'DROP TABLE '+name as Tabela_Deletar
    from sys.sysobjects
    where name like 'TMP_%' and type = 'U'
    Pra obter o que preciso, porém existe a dependência de executar o processo ainda manualmente, sendo que o objetivo é automatizar através de um procedimento ou talvez um gatilho.

    segunda-feira, 25 de novembro de 2013 11:46
  • Olá Amigo.

    Utilize o sp_executesql, para executar o comando para você. Basta agora schedular em um job.

    use Teste
    go 
    declare @cmd nvarchar(4000)
    
    while exists (select 1
    from sys.sysobjects
    where name like 'TMP_%' and type = 'U')
    
    begin
    
    select top 1 @cmd = 'DROP TABLE '+name
    from sys.sysobjects
    where name like 'TMP_%' and type = 'U'
    
    exec sp_executesql @cmd
    
    end

    abraço.

    segunda-feira, 25 de novembro de 2013 12:17
  • Olá Marcelo, funcionou perfeitamente.

    Obrigado!

    segunda-feira, 25 de novembro de 2013 14:19