none
Como fazer um DROP TABLE (múltiplo) ? RRS feed

  • Pergunta

  • Bom dia !

    Alguém já fez um DROP TABLE (múltiplo) ?

    Se no comando abaixo é listado todas as tabelas do banco:
    SELECT
     TABLE_NAME FROM 
    test.information_schema.tables
    
    Como faço um DROP múltiplo, estou tentando assim:
    DROP 
    TABLE 
    test.information_schema.tables
    
    Msg 3701, Level 11, State 5, Line 1
    Cannot drop the table 'test.information_schema.tables', because it does not exist or you do not have permission.
    DROP 
    TABLE 
    (select 
    TABLE_NAME from 
    test.information_schema.tables)
    Msg 102, Level 
    15, State 1, Line 1
    Incorrect syntax near '(' 
    .
    
    Surgiu a necessidade de aplicar isso.
    -
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    • Editado aNetao quinta-feira, 20 de agosto de 2009 12:45
    quinta-feira, 20 de agosto de 2009 12:42

Respostas

  • Olá,

    Desabilitar uma FK faz com que a validação de integridade de dados não seja feita, por isso você consegue apagar os dados. MAS...o DROP TABLE realmente não irá funcionar.

    Agora...se você já tem uma PROC que faz a desativação das FKs e você quer RECRIAR as tabelas...

    Porque você não ALTERA o script para fazer um DROP das FKs ao invés de desativa-las? em seguinda você faz os DROP TABLES que já possue.

    Esta postagem é provida "COMO ESTÁ" sem garantias, e não conferem direitos.


    Alex Rosa -- Sharing my knowledge at http://www.keep-learning.com/blog
    • Marcado como Resposta Fernanda Simões segunda-feira, 24 de agosto de 2009 17:40
    segunda-feira, 24 de agosto de 2009 02:06

Todas as Respostas

  • Netão...... que perigo hein??  Usa a sp_MSforeachtable  p/ isso, mas você não tem hierarquia entre as tabelas???

    exec sp_MSforeachtable 'Print ("Drop Table ?")'






    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    quinta-feira, 20 de agosto de 2009 12:51
  • aNetão,

    Concordo com o Fausto, já utilizei muito a sp_msforeachtable, é uma boa solução.

    Mas você deverá verificar se não existe relacionamento entre estas tables, isso poderá atrapalhar um pouco.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 20 de agosto de 2009 14:04
  • Olá,

    Vale lembrar que a procedure sp_MSforeachtable é uma procedure não documentada do SQL Server. Isso significa que ela pode não estar disponível em uma próxima versão do produto e também não tem a sua funcionalidade garantida.

    Tente usar as views do sistema sys.tables e sys.foreign_keys para listar as tabelas e os relacionamentos existentes no banco. Apague os relacionamentos primeiro e depois apague as tabelas.

    []s.
    • Sugerido como Resposta Marcos Galvani quinta-feira, 20 de agosto de 2009 14:49
    quinta-feira, 20 de agosto de 2009 14:41
  • Olá,

    Fiquei curioso em saber como vocês chegaram a conclusão dessa necessidade.

    Será usado para remover algumas tabelas ou todas?
    Você pode compartilhar os motivos conosco?
    Alex Rosa -- Sharing my knowledge at http://www.keep-learning.com/blog
    quinta-feira, 20 de agosto de 2009 23:35
  • Tô vendo que o Fausto já se assusto, e o Alex tb !

    É o seguinte, tais tabelas não são do sistema transacional (aquela que software grava no banco).
    E sim, passa por um ETL("zinho") e é transformado em um ODS. Ou seja, do transacional passa para um ODS (outra base).

    Como a base do sistema transacional está passando por processo de data quality. Essa base do ODS terá que ser sempre de ser refeita.
    Por que em tese, a base do transacional vai ficando limpa aos poucos. E por consequência, o ODS tb !

    A minha idéia é sempre fazer um processo de recarga programada (pretensão - diario - carga na madrugada), estava fazendo dessa forma !!! Mas, fazia o uso de DELETE FROM para limpar as tabelas.

    E também, visando que o ODS sempre pude aumentar uma tabelinha ali, uma coluna .... e etc.
    Vou DROP as tabelas. Assim, crio de novo!!! (outra PROC para criar as tabelas)

    Então, para isso tenho um scrip (uma PROC) que desabilita/habilita os relacionamentos da database corrente que funcionava com os DELETE FROM, e não está funcionando com os DROP TABLE.

    Bom, 1° passo tenho o script que desabilita os relacionamentos, que funciona SO com o DELETE, e com DROP TABLE não !

    Nesse 1° passo podem me ajudar em analisar esse script (abaixo) o por que não funciona para DROP TABLE (esses DROPs estão em outra PROCs).
    --Segue proc para ligar/desligar FKs. Use com cuidado, uma vez que pode deixar o banco em estado inconsistente.
    /* PROC para ligar/desligar integridade referencial do banco */
    --Como usar:
    -- CRIAR a SP no banco, após:
    --exec IOForeignKeys 0 -- desliga a integridade referencial
    --exec IOForeignKeys 1 -- liga a integridade referencial
    
    /****** Object: StoredProcedure [dbo].[IOForeignKeys] Script Date: 08/10/2009 09:54:15 ******/
    CREATE procedure [dbo].[IOForeignKeys] @PutFK integer
    As
    	declare @IdFK integer
    	declare @ForeignKey sysname
    	declare @ChildTable sysname
    	declare @ParentTable sysname
    	declare @ParentColumn sysname
    	declare @ChildColumn sysname
    	declare @ParentColumns varchar(1000)
    	declare @ChildColumns varchar(1000)
    
    	if exists (select 1 from sysobjects where type = 'U' and Name ='metForeignKeys')
    		drop table metForeignKeys
    
    	select * into metForeignKeys from
    		( select FK .constid as IdFK,
    			FK .KeyNo,
    			sofk .name as [Foreign Key Name],
    			soch .name as [Child Table],
    			scch .name as [Child Column],
    			sopa .name as [Parent Table],
    			scpa .name as [Parent Column]
    		from sysforeignkeys FK inner join sysobjects sofk on FK.constId = sofk.id
    		inner join sysobjects soch on FK.fkeyid = soch.id
    		inner join syscolumns scch on FK.fkeyid = scch.id and FK.fkey = scch.colid
    		inner join sysobjects sopa on FK.rkeyid = sopa.id
    		inner join syscolumns scpa on FK.rkeyid = scpa.id and FK.rkey = scpa.colid )T
    	
    	declare met_C_Delete cursor for 
    		select distinct IdFK from metForeignKeys
    		open met_C_Delete
    		fetch next from met_C_Delete into @IdFK
    	
    		while @@Fetch_Status = 0
    		begin
    			select @ForeignKey = [Foreign Key Name], @ChildTable = [Child Table], @ParentTable = [Parent Table]
    				from metForeignKeys where IdFK = @IdFK
    			if @PutFK = 0
    				EXEC( 'alter table [' + @ChildTable + '] with check nocheck constraint ' + @ForeignKey)
    			else
    				EXEC( 'alter table [' + @ChildTable + '] with check check constraint ' + @ForeignKey)
    			fetch next from met_C_Delete into @IdFK
    		end
    	
    	close met_C_Delete
    	deallocate met_C_Delete
    Obs.: Serve em qq base
    -
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    sexta-feira, 21 de agosto de 2009 01:34
  • ! Up !
    No aguardo !

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    sexta-feira, 21 de agosto de 2009 15:04
  • ! Up !
    No aguardo !
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    domingo, 23 de agosto de 2009 00:47
  • Olá,

    Desabilitar uma FK faz com que a validação de integridade de dados não seja feita, por isso você consegue apagar os dados. MAS...o DROP TABLE realmente não irá funcionar.

    Agora...se você já tem uma PROC que faz a desativação das FKs e você quer RECRIAR as tabelas...

    Porque você não ALTERA o script para fazer um DROP das FKs ao invés de desativa-las? em seguinda você faz os DROP TABLES que já possue.

    Esta postagem é provida "COMO ESTÁ" sem garantias, e não conferem direitos.


    Alex Rosa -- Sharing my knowledge at http://www.keep-learning.com/blog
    • Marcado como Resposta Fernanda Simões segunda-feira, 24 de agosto de 2009 17:40
    segunda-feira, 24 de agosto de 2009 02:06
  • Alex,

    eh, já segui esse raciocinio ontem, mesmo! E funcionou!
    Valew!

    Obs.: Agora vou tentar otimizar o script !
    -

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    segunda-feira, 24 de agosto de 2009 11:50