none
Query em outra base de dados RRS feed

  • Pergunta

  • Eu tenho varias bases de dados e preciso que as procedures da principal peguem os dados de apenas de outra, mas esta outra eu configuro por parâmetro no meu procedure total, mas como eu rodo os procedures na principal, eu não posso utilizar o comando "USE" que troca a base e também não posso utilizar o "EXEC" para executar uma varchar ou uma char com a base que eu quero pois pois colocar SQL em uma string não é uma boa prática, vai que o cara coloca um *, no select e caga tudo na hora de executar.

    Bom, resumindo, troca de base numa query de Select sem uso do "exec" ou "use" como um select * from @base..cadastro mas essa linha de comando não da, ta errada.

    Valeu

    • Tipo Alterado Marcos SJ quarta-feira, 24 de fevereiro de 2016 18:40
    • Tipo Alterado Roberto F FonsecaModerator segunda-feira, 29 de fevereiro de 2016 16:21 Alterado para pergunta
    segunda-feira, 19 de agosto de 2013 12:56

Respostas

  • Ilanocf,

    Como você esta utilizando o comando EXEC para executar sua Stored Procedure é obrigatório e necessário que todas as variáveis estejam declaradas em conjunto com os comandos, ou seja, em cada variável @Comando deve contar a declaração das variáveis.

    Outra possibilidade seria utilizar o comando sp_executesql passando estas variáveis como parâmetros de execução.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos SJ terça-feira, 1 de março de 2016 20:15
    sexta-feira, 26 de fevereiro de 2016 18:10

Todas as Respostas

  • Cassio,

    A unica forma de realizar isso seria fazendo uma concatenação numa string e executando via EXEC (@Variavel). Sim, com isso existem questões de seguranças bem complexas e é efetivamente uma falha, o nome disos é SQL Injection, porem o SQL Injection é tratado em aplicação. Para banco de dados não vejo outra solução.


    <b>Fabrizzio A. Caputo</b><br/> Certificações:<br/> MCT<br/> MCC<br/> Oracle OCA 11g<br/> MCITP SQL Server 2008 BI<br/> MCITP SQL Server 2008 Implementation and Maintenance<br/> MCITP SQL Server 2008 Developer<br/> ITIL V3 Foundation <br/> Blog Pessoal: <a href="http://fabrizziocaputo.wordpress.com">www.fabrizziocaputo.wordpress.com</a><br/> Email: fabrizzio.antoniaci@gmail.com

    segunda-feira, 19 de agosto de 2013 15:56
    Moderador
  • Cassio,

    Veja se isso ajuda:

    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
    
    
    
    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')


    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]

    sábado, 24 de agosto de 2013 14:26
  • não me ajuda, mas valeu a intenção

    preciso de algo tipo assim:

    Declare @base as char(10)

    Set base=sistema_teste

    select * from @base..tabela

    lembrando que apenas a variável @base existe e nela contem o nome da base de dados que eu quero acessar do meu banco

    simples, sql estática, não dentro de uma string, aqui a gente tem umas querys sql enormes, se eu enfiar o negócio dentro de uma string, na hora de colocar a query no store procedure, o sql server não vai avisar que ta errado, e dai quando executar: PAU.

    segunda-feira, 26 de agosto de 2013 12:07
  • Olá galera,

    Aproveitando esse post. Estou tentando fazer o script abaixo para fazer o restore da minha base.

    DECLARE @BASE VARCHAR(30)
    DECLARE @ChamaBase VARCHAR
    DECLARE @Comando1 VARCHAR
    DECLARE @Comando2 VARCHAR
    DECLARE @Restaura VARCHAR
    DECLARE @Diretorio VARCHAR
    
    SET @Diretorio = 'K:\_BACKUP\BANCO.bak'
    SET @BASE = 'BANCO'
    
    SET @ChamaBase = 'USE ' + @BASE + ' '
    
    
    SET @Comando1 = 'ALTER DATABASE ' + @BASE + ' SET OFFLINE WITH ROLLBACK IMMEDIATE'
    
    SET @Restaura = 'RESTORE DATABASE ' + @BASE + ' FROM  DISK = N' + '`' + @Diretorio + '`' + ' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10'
    
    SET @Comando2 = 'ALTER DATABASE ' + @BASE + ' SET ONLINE WITH ROLLBACK IMMEDIATE'
    
    
    EXEC(@Comando1)
    EXEC(@Restaura)
    EXEC(@Comando2)
    
    EXEC(@ChamaBase + 'SELECT * FROM Contas')

    Mas está dando os seguintes erros:


    Msg 2812, Level 16, State 62, Line 1
    Could not find stored procedure 'A'.
    Msg 2812, Level 16, State 62, Line 1
    Could not find stored procedure 'R'.
    Msg 2812, Level 16, State 62, Line 1
    Could not find stored procedure 'A'.
    Msg 102, Level 15, State 1, Line 1
    Incorrect syntax near '*'.

    Como podemos resolver isso?

    Grato,

    Ilano

    quarta-feira, 24 de fevereiro de 2016 12:59
  • Ilanocf,

    Como você esta utilizando o comando EXEC para executar sua Stored Procedure é obrigatório e necessário que todas as variáveis estejam declaradas em conjunto com os comandos, ou seja, em cada variável @Comando deve contar a declaração das variáveis.

    Outra possibilidade seria utilizar o comando sp_executesql passando estas variáveis como parâmetros de execução.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos SJ terça-feira, 1 de março de 2016 20:15
    sexta-feira, 26 de fevereiro de 2016 18:10
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 1 de março de 2016 20:15