Usuário com melhor resposta
Declaração de Parametro no select

Pergunta
-
Boa tarde galera?
Estou com uma duvida. Como declarar uma variavel no meu select na clausula WHERE? Essa variavel eu preciso declarar ela no script, onde ficara armazenada nessa variavel a DATA, ou seja, uma sera o ano, a outra mes e a outra dia.
WHERE SUBSTRING(CONVERT(CHAR,DATAEMISSAO,103),7,5)=2011 (@VARIAVEL)
AND SUBSTRING(CONVERT(CHAR,DATAEMISSAO,103),4,2)=01 (@VARIAVEL)
AND SUBSTRING(CONVERT(CHAR,DATAEMISSAO,103),1,2) < 20 (@VARIAVEL)
Desde já obrigada
Respostas
-
Novaes,
Voce não consegue fazer essa sintaxe, veja, voce deve setar os valores para cada variavel antes, para depois poder utilizada aonde quiser.
DECLARE @Ano INT
DECLARE @Mes INT
DECLARE @Dia INT
SET @Ano = (Select Ano FROM Tabela)
SET @Mes = (Select Mes FROM Tabela)
SET @Dia = (Select Dia FROM Tabela)
Agora, se voce quiser uitilizar essa variavel no select, pode utilizar de 2 maneiras:
1 - Dependendo do que a variavel possui é possivel coloca-la diretamente no select:
SELECT Dados FROM Tabela WHERE Ano = @Ano
2 - Montar seu select como string e depois executado:
DECLARE @Tabela VARCHAR(100)
SET @Tabela = 'Tabela01'
DECLARE @Script VARCHAR(8000)
SET @Script = 'SELECT Dados FROM '+@Tabela+' WHERE ANO = ''2011'' '
EXEC (@Script)
Fabrizzio A. Caputo
Certificações: Oracle OCA 11g, MCTS SQL Server 2008 Implementation and Maintenance
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta NovaesB segunda-feira, 11 de julho de 2011 16:36
Todas as Respostas
-
Novaes,
Voce não consegue fazer essa sintaxe, veja, voce deve setar os valores para cada variavel antes, para depois poder utilizada aonde quiser.
DECLARE @Ano INT
DECLARE @Mes INT
DECLARE @Dia INT
SET @Ano = (Select Ano FROM Tabela)
SET @Mes = (Select Mes FROM Tabela)
SET @Dia = (Select Dia FROM Tabela)
Agora, se voce quiser uitilizar essa variavel no select, pode utilizar de 2 maneiras:
1 - Dependendo do que a variavel possui é possivel coloca-la diretamente no select:
SELECT Dados FROM Tabela WHERE Ano = @Ano
2 - Montar seu select como string e depois executado:
DECLARE @Tabela VARCHAR(100)
SET @Tabela = 'Tabela01'
DECLARE @Script VARCHAR(8000)
SET @Script = 'SELECT Dados FROM '+@Tabela+' WHERE ANO = ''2011'' '
EXEC (@Script)
Fabrizzio A. Caputo
Certificações: Oracle OCA 11g, MCTS SQL Server 2008 Implementation and Maintenance
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta NovaesB segunda-feira, 11 de julho de 2011 16:36
-
Boa Tarde,
Esse é o primeiro passo para dar Adeus ao desempenho do seu banco. Funções como CONVERT e SUBSTRING podem reduzir drasticamente o desempenho de suas consultas quando utilizadas na cláusula WHERE. Há mais detalhes no artigo abaixo:
DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs
http://gustavomaiaaguiar.wordpress.com/2011/07/03/datediff-convert-substring-e-funes-sobre-colunas-na-clusula-where-e-joins/Sugiro rever essa construção. Se o usuário irá passar o ano, mês e o dia, faça uma concatenação, monte a data e compare com sua coluna de data. Isso é muito mais performático do que converter as colunas de todos os registros para comparar com a variável. É mais interessante converter a variável uma única vez, do que converter todos os registros.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Fredy Esmeraldo sábado, 9 de julho de 2011 16:44
-
Novaes, você tem uma procedure ou função na qual existem essas variáveis? É isso? Se for, acate o que o Gustavo lhe recomendou. Abaixo segue um exemplo de concatenação dos parâmetros de dia, mês e ano em uma única variável.
Declare @Tabela Table (Data DateTime)
Insert Into @Tabela Values ('05/14/2011'), ('05/14/2011'), ('05/16/2011'), ('05/20/2011')
Declare @Dia int, @Mes int, @Ano int, @DataCompleta DateTime
Select @Dia = 14, @Mes = 5, @Ano = 2011
-- Monta a data completa com os parâmetros passados
Set @DataCompleta = Convert(DateTime, Convert(VarChar(02), @Mes) + '/' + Convert(VarChar(02), @Dia) + '/' + Convert(VarChar(04), @Ano))
-- Faz um Select sem a necessidade de funções
Select * From @Tabela Where (Data = @DataCompleta)
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Sugerido como Resposta Fredy Esmeraldo sábado, 9 de julho de 2011 16:43
-
Boa tarde Fabrizzio!
Tem como eu setar uma variavel usando a funcao between, é que eu preciso declarar um valor para o meu parametro entre uma data inicial e a outra final?
Eu pensei em fazer assim, mas nao deu certo:
DECLARE @DTEMISSAOINI DATE
DECLARE @DTEMISSAOFIN DATE
SET @DTEMISSAOINI > 01-01-2011
SET @DTEMISSAOFIN < 30-06-2011
O que me atenderia seria mesmo a funcao between
Obrigada
-
Novaes,
É quase isso, na verdade, voce pode sim colocar o between com variaveis, mas fica mais ou menos desta maneira:
DECLARE @inicio DATETIME
DECLARE @fim DATETIME
SET @inicio = '2011-05-05'
SET @fim = '2011-05-05'
SELECT Campos FROM Tabela WHERE CampoData Between @Inicio and @Fim
Fabrizzio A. Caputo
Certificações: Oracle OCA 11g, MCITP SQL Server 2008 Implementation and Maintenance
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com