none
Como criar um script único para ser executado em N bases RRS feed

  • Pergunta

  • Bom Dia, pessoal.

    Estou com um problema na execução dos scripts no SQL 2005.

    Hoje eu administro 10 bases e todas tem um nome diferente.

    Tenho sempre que criar os scripts para cada base especificando o "Use DBNAME_ESPECIFICO;"

    Então veio a idéia de padronizar os scripts,

    Meu código está "quase completo", pois o problema é quando executo CREATE ou ALTER VIEW;

    Assim funciona:

    begin

     

    declare @nome_db varchar(30)

     

    declare @str varchar(3000)

     

    use MASTER

     

    select @nome_db= [name] from sysdatabases where [name] like 'LOJA%'

     

    SET @str = 'USE ' + @nome_db + ';

    DROP TABLE [dbo].[TESTE] '

     

     

    exec(@str);

    end

    ASSIM NÃO FUNCIONA:

    begin

     

    declare @nome_db varchar(30)

     

    declare @str varchar(3000)

     

    use MASTER

     

    select @nome_db= [name] from sysdatabases where [name] like 'LOJA%'

     

    SET @str = 'USE ' + @nome_db + ';

    CREATE VIEW [dbo].[TARIFA] as

    SELECT PRECO FROM TARIFAS '

     

     

    exec(@str);

    end

    Erro: 'CREATE VIEW' must be the first statement in a query batch.

     

    Minha dúvida é:

    Existe outra maneira de trocar o nome da base antes de executar os scripts?

    Como eu faço pra executar o CREATE ou ALTER pelo exec, especificando o nome da base?

    Obrigado pela atenção de todos!

     

     

     

    • Movido Gustavo Maia Aguiar terça-feira, 8 de junho de 2010 16:42 (De:SQL Server - Desenvolvimento Geral)
    terça-feira, 8 de junho de 2010 14:22

Respostas

  • Henriques, segue um exemplo... o segredo é usar a sp_executeSQL chamando ela pelo banco que você deseja criar a view...

    declare @nome_db varchar(30)
    declare @str_1 Nvarchar(3000) 
    declare @str_2 Nvarchar(3000) 
    use MASTER
    select @nome_db= [name] from sysdatabases where [name] like 'tempdb%' 
    
    SET @str_1 = 'CREATE VIEW [dbo].test as SELECT * FROM sysobjects'
    
    set @str_2 = 'exec ' + @nome_db + '.dbo.sp_executeSQL N' + Quotename(@str_1,'''')
    
    print @str_2
    exec (@str_2);
    
    select * from tempdb.dbo.test

    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://fabianosqlserver.spaces.live.com/
    • Marcado como Resposta E.Henriques sexta-feira, 11 de junho de 2010 17:10
    terça-feira, 8 de junho de 2010 20:40
  • Henrique,

    Este seria a minha sugestão:

    Declare

    @Comando1 Varchar(100),

                @Banco VarChar(30)

    Select

    @Banco = name from master.sys.sysdatabases Where dbid=5

    Set

    @Comando1='Use ' + @Banco

    --Utilizando o Comando Exec

    Exec

    (@Comando1 + ' Select * from sys.sysobjects')

    --Utilizando o Comando Execute

    Execute

    (@Comando1 + ' Select * from sys.sysobjects')

     

    Poderíamos transformar este bloco de código em uma procedure com um parâmetro de entrada para obter o ID do banco ou então o nome do banco.


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

    • Marcado como Resposta Fernanda Simões quinta-feira, 10 de junho de 2010 17:42
    quarta-feira, 9 de junho de 2010 18:08
    Moderador

Todas as Respostas

  • E.Henrique

    Existe uma proedure nao documentada que pode de ajudar...

    tente assim:

    sp_msforeachdb 'CREATE VIEW [dbo].[TARIFA] as
    SELECT PRECO FROM TARIFAS '
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    terça-feira, 8 de junho de 2010 16:01
    Moderador
  • Henrique,

    A sugestão do Marcelo é válido.

    Da maneira que você esta querendo utilizar o comando Use o SQL Server não suporta, pois você esta tentando mudar em tempo de execução o seu contexto de banco de dados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 8 de junho de 2010 18:25
    Moderador
  • Henriques, segue um exemplo... o segredo é usar a sp_executeSQL chamando ela pelo banco que você deseja criar a view...

    declare @nome_db varchar(30)
    declare @str_1 Nvarchar(3000) 
    declare @str_2 Nvarchar(3000) 
    use MASTER
    select @nome_db= [name] from sysdatabases where [name] like 'tempdb%' 
    
    SET @str_1 = 'CREATE VIEW [dbo].test as SELECT * FROM sysobjects'
    
    set @str_2 = 'exec ' + @nome_db + '.dbo.sp_executeSQL N' + Quotename(@str_1,'''')
    
    print @str_2
    exec (@str_2);
    
    select * from tempdb.dbo.test

    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://fabianosqlserver.spaces.live.com/
    • Marcado como Resposta E.Henriques sexta-feira, 11 de junho de 2010 17:10
    terça-feira, 8 de junho de 2010 20:40
  • Henrique,

    Este seria a minha sugestão:

    Declare

    @Comando1 Varchar(100),

                @Banco VarChar(30)

    Select

    @Banco = name from master.sys.sysdatabases Where dbid=5

    Set

    @Comando1='Use ' + @Banco

    --Utilizando o Comando Exec

    Exec

    (@Comando1 + ' Select * from sys.sysobjects')

    --Utilizando o Comando Execute

    Execute

    (@Comando1 + ' Select * from sys.sysobjects')

     

    Poderíamos transformar este bloco de código em uma procedure com um parâmetro de entrada para obter o ID do banco ou então o nome do banco.


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

    • Marcado como Resposta Fernanda Simões quinta-feira, 10 de junho de 2010 17:42
    quarta-feira, 9 de junho de 2010 18:08
    Moderador
  • Grato pessoal pela ajuda. Vou tentar e depois eu volto com a resposta. Abs
    quinta-feira, 10 de junho de 2010 19:35
  • Fabiano, grato pela ajuda, seu código funcionou perfeitamente!!! abs
    sexta-feira, 11 de junho de 2010 17:12
  • Pessoal,

    Estou com um problema semelhante.

    É possível eu executar o procedimento acima, chamado numa única janela de Query bases em diferentes servidores?

    Abs!

    sexta-feira, 30 de julho de 2010 00:56
  • Vinão,

    É possível sim, mas para isso você terá que criar um canal de comunidade entre estes servidores chamados Linkeds Servers.

     

    Agora gostaria de solicitar que você evite duplicar o mesmo post em diversas categorias do nosso fórum!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    sexta-feira, 30 de julho de 2010 01:24
    Moderador
  • I'm so sorry!

    Eu posto sempre quando não acho alguma coisa, então posto e continuo procurando mensagens! :\

    Jr. Galvão,

    Como criar um canal de comunidade entre estes servidores?

    Vlw mais uma vez!
    Abs!

    sexta-feira, 30 de julho de 2010 15:24
  • Eu tentei declarar variaveis, mas encontrei erros, por exemplo:

    declare @server nvarchar

    set @server = 'db-server-01'

    E no código abaixo, utilizei @server entre ''

    Mas o script encontra erros; É possível declarar variaveis nesta situação? (Este esquema de declaração, funciona em outros scripts!)
    :\

     

    USE ADVENTUREWORKS
    GO
    SELECT * FROM PERSON.CONTACT

    USE MASTER
    GO
    EXEC SP_ADDLINKEDSERVER
        'DB-SERVER-02',
        N'SQL Server'
    GO
    USE ADVENTUREWORKS
    GO
    SELECT * FROM PERSON.CONTACTTYPE
    EXEC SP_DROPSERVER 'DB-SERVER-02'

    sexta-feira, 30 de julho de 2010 15:41