Usuário com melhor resposta
Query em outra base de dados

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
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
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
-
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]
-
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.
-
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
-
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
-
Boa tarde,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
AtenciosamenteMarcos 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.