Usuário com melhor resposta
executar query dentro de string

Pergunta
-
tenho a seguinte query:
declare @sql varchar(2000), @var varchar(100) set @sql = 'select ' set @sql = @sql + '@var = coluna1 ' set @sql = @sql + 'from ' set @sql = @sql + 'tabela ' print (@sql)
o esperado é isso: select @var = coluna1 from tabela
minha pergunta é: porque quando dando faço exec (@sql) ele diz que a variável @var não existe sendo que ela está declarada? é porque está dentro de uma string?
eu preciso colocar a query em string poruqe vou precisar fazer alguns if's.
obriagdo
Respostas
-
Acho que intendi. Tente jogar a declaração da variável dentro da string que será executada.
declare @comando varchar(max) set @comando = ' declare @teste varchar(10)= ''clientes'' SELECT * FROM SYS.OBJECTS WHERE NAME = @teste' execute(@COMANDO)
é isso?
abraços
Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com
- Editado DhiegoPiroto sexta-feira, 9 de março de 2012 16:39
- Sugerido como Resposta DhiegoPiroto sexta-feira, 9 de março de 2012 19:00
- Marcado como Resposta Eder Costa terça-feira, 13 de março de 2012 12:37
-
Rafa-martin boa noite!
Acho que você pode tentar usar a sp_executesql pra recuperar o valor da variável dentro do SQL dinâmico. Segue exemplo:
DECLARE @VarExterna int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);-- Comando SQL
SET @SQLString = N'SELECT @VarInterna = 1'
--
--Definições das variáveis que serão utlizadas como parâmetros
SET @ParmDefinition = N'@VarInterna tinyint output';
--
-- Execução da instrução
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@VarInterna = @VarExterna out;
--
-- Retorno da variável
select @VarExternaEspero que ajude! Luiz Phellipe
- Sugerido como Resposta Luiz Phellipe sábado, 10 de março de 2012 00:47
- Marcado como Resposta Eder Costa terça-feira, 13 de março de 2012 12:37
Todas as Respostas
-
Olá Rafa,
Você usará SQL dinâmico, apenas tome cuidado com o péssimo desempenho que esta forma de codificar costuma ter, pois naão há reutilização do plano de execução. Bom, para resolver isto você precisará concatenar os valores, pois o sql dinâmico trataria sua variável como um texto.
exemplo:
declare @comando varchar(max) declare @tabela varchar(max) = 'clientes' set @comando = 'SELECT * FROM SYS.OBJECTS WHERE NAME = '''+ @tabela+'''' execute(@COMANDO)
Se útil, Classifique.
Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com
- Editado DhiegoPiroto sexta-feira, 9 de março de 2012 16:00
-
mais veja que tenho uma variável (@var) dentro da string que depois eu vou executar.
o que preciso é executar essa string com a variável dentro dela. só que se executa da forma q fiz dá erro, dizendo que a minha variável não existe. porque ela está fora da string. entendeu do que preciso?
-
Acho que intendi. Tente jogar a declaração da variável dentro da string que será executada.
declare @comando varchar(max) set @comando = ' declare @teste varchar(10)= ''clientes'' SELECT * FROM SYS.OBJECTS WHERE NAME = @teste' execute(@COMANDO)
é isso?
abraços
Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com
- Editado DhiegoPiroto sexta-feira, 9 de março de 2012 16:39
- Sugerido como Resposta DhiegoPiroto sexta-feira, 9 de março de 2012 19:00
- Marcado como Resposta Eder Costa terça-feira, 13 de março de 2012 12:37
-
Rafa-martin boa noite!
Acho que você pode tentar usar a sp_executesql pra recuperar o valor da variável dentro do SQL dinâmico. Segue exemplo:
DECLARE @VarExterna int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);-- Comando SQL
SET @SQLString = N'SELECT @VarInterna = 1'
--
--Definições das variáveis que serão utlizadas como parâmetros
SET @ParmDefinition = N'@VarInterna tinyint output';
--
-- Execução da instrução
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@VarInterna = @VarExterna out;
--
-- Retorno da variável
select @VarExternaEspero que ajude! Luiz Phellipe
- Sugerido como Resposta Luiz Phellipe sábado, 10 de março de 2012 00:47
- Marcado como Resposta Eder Costa terça-feira, 13 de março de 2012 12:37