none
Declaração de Parametro no select RRS feed

  • 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

    sexta-feira, 8 de julho de 2011 17:11

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
    sexta-feira, 8 de julho de 2011 17:19
    Moderador

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
    sexta-feira, 8 de julho de 2011 17:19
    Moderador
  • 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
    sexta-feira, 8 de julho de 2011 17:22
  • 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.br

    Se 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.

    sexta-feira, 8 de julho de 2011 21:56
  • 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

    segunda-feira, 11 de julho de 2011 18:29
  • 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
    segunda-feira, 11 de julho de 2011 19:01
    Moderador