none
Criar Campo em todos as bases do servidor RRS feed

  • Pergunta

  • Pessoal boa tarde tudo bem?

    Tenho um servidor com mais de 100 bancos de dados, cada cliente um banco de dados, por exemplo dentro da tabela1 de todos os bancos preciso criar um campo.

    Normalmente uso ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)

    Como faço para inserir em todos os bancos de uma só vez?

    Grato,

    Wagner


    Wagner_fix

    sexta-feira, 3 de novembro de 2017 15:12

Respostas

  • Olá, vejo se isso atende.

    exec sp_msforeachdb @command1 = N‘    use ? 
    									ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)'
                                                                   


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    • Marcado como Resposta Wagner_fix sexta-feira, 3 de novembro de 2017 16:13
    sexta-feira, 3 de novembro de 2017 15:32

Todas as Respostas

  • Olá, vejo se isso atende.

    exec sp_msforeachdb @command1 = N‘    use ? 
    									ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)'
                                                                   


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    • Marcado como Resposta Wagner_fix sexta-feira, 3 de novembro de 2017 16:13
    sexta-feira, 3 de novembro de 2017 15:32
  • Wagner, você pode utilizar o script abaixo

    CREATE TABLE #TmpBases
    
    (	
    	ID INT IDENTITY(1,1)
    	,NomeBase VARCHAR(100)
    )
    
    INSERT INTO #TmpBases (NomeBase)
    SELECT name FROM Sys.databases
    where database_id > 5
    
    
    DECLARE @Controle INT = 1, @Comando NVARCHAR(MAX), @NomeBase VARCHAR(100)
    
    WHILE @Controle <= (SELECT MAX(ID) FROM #TmpBases)
    BEGIN
    
    	SELECT @NomeBase = NomeBase FROM #TmpBases WHERE ID = @Controle
    	
    
    	SET @Comando = N'USE ' + @NomeBase 
    	+ ' ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)'
    
    	
    	EXEC (@Comando)
    
    	SET @Controle = @Controle + 1
    
    END
    
    
    DROP TABLE #TmpBases

    Lembrando que esse código não deve ser colocado dessa maneira em qualquer aplicação pelo risco de SQL Injection ok?


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    sexta-feira, 3 de novembro de 2017 15:44
  • Olá, vejo se isso atende.

    exec sp_msforeachdb @command1 = N‘    use ? 
    									ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)'
                                                                   


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    Vinícus

    Essa procedure não funciona em 100% das bases.
    Tive alguns problemas em rotinas de monitoramento minhas onde em uma execução ela passava por determinado database, e em outra execução não!

    Não sei o que faz ela ignorar determinado database, mas sei que isso acontece e com uma certa frequência. Por isso deixei de usá-la.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    sexta-feira, 3 de novembro de 2017 15:47
  • Olá, vejo se isso atende.

    exec sp_msforeachdb @command1 = N‘    use ? 
    									ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)'
                                                                   


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    Vinícus

    Essa procedure não funciona em 100% das bases.
    Tive alguns problemas em rotinas de monitoramento minhas onde em uma execução ela passava por determinado database, e em outra execução não!

    Não sei o que faz ela ignorar determinado database, mas sei que isso acontece e com uma certa frequência. Por isso deixei de usá-la.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    Estranho, sempre funcionou para mim, inclusive colocando filtros para apenas as bases que eu gostaria de rodar o comando.

    De qualquer forma acho que vale o teste e um ambiente de testes.

     

    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    sexta-feira, 3 de novembro de 2017 15:57
  • Muito bom, deu muito certo simples e objetivo...

    Isso também funcionaria se eu quisesse criar tabela?

    Muito obrigado por tirar um tempo para me ajudar...

    Wagner


    Wagner_fix

    sexta-feira, 3 de novembro de 2017 16:14
  • Mariana, testei e da erro... 

    Mesmo assim, muito obrigado por tirar um tempo para me ajudar...

    Wagner


    Wagner_fix

    sexta-feira, 3 de novembro de 2017 16:15
  • Qual é o erro Wagner?

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    sexta-feira, 3 de novembro de 2017 16:23
  • Olá, vejo se isso atende.

    exec sp_msforeachdb @command1 = N‘    use ? 
    									ALTER TABLE TABELA1 ADD CAMPO10 VARCHAR(14)'
                                                                   


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    Vinícus

    Essa procedure não funciona em 100% das bases.
    Tive alguns problemas em rotinas de monitoramento minhas onde em uma execução ela passava por determinado database, e em outra execução não!

    Não sei o que faz ela ignorar determinado database, mas sei que isso acontece e com uma certa frequência. Por isso deixei de usá-la.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    Estranho, sempre funcionou para mim, inclusive colocando filtros para apenas as bases que eu gostaria de rodar o comando.

    De qualquer forma acho que vale o teste e um ambiente de testes.

     

    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    Eu nunca havia procurado referências para entender o porque disso acontecer, mas pelo jeito acontece com outras pessoas também.

    Um trecho do artigo abaixo

    "The problems with this procedure are well documented – the most notable being that it can skip databases without any warning"

    Read more: http://shaunjstuart.com/archive/2012/10/its-time-to-retire-sp_msforeachdb/#ixzz4xO1qGzfW 
    Under Creative Commons License: Attribution Non-Commercial No Derivatives"


    Então para rotinas críticas eu não uso essa procedure.

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    sexta-feira, 3 de novembro de 2017 16:24