none
problema em SELECT no server express 2005 RRS feed

  • Pergunta

  • Desenvolvi uma aplicação usando o SQL Server 2005 (full). No cliente é usado o SQL Express 2005 por ser a versão gratuita.

    Preciso fazer um select em uma view que usa dados de duas tabelas: Vendas (de onde tiro os campos "idVenda" e "DataVenda") e ItemVenda (de onde vêm os campos "PrecoVenda", "Desconto" e "Quant").

    No meu SQL a query resulta num resultado perfeito, mas no Express voltam TODOS os registros, mostrando as datas como se TODAS fossem a solicitada (não chega a alterar os registros originais, só mostra errado). 

    É um bug? Alguém já passou por isso? Sabem como arrumar?

    A SELECT em questão é:

    SELECT distinct idVenda, SUM(Quant) as Itens, SUM((PrecoVenda-Desconto)*Quant) as              Valor
    FROM vw_VendasDia
    WHERE DataVenda='2011/12/21'
    GROUP BY idVenda
    ORDER BY idVenda

    A DataVenda usada aqui é só um exemplo. Ela é trocada por uma variável no programa, obviamente.

    quarta-feira, 21 de dezembro de 2011 20:29

Respostas

  • Olá Eve, para ti ocorreu o problema com os exemplos que tu me passou?

    Fiz um exemplo com banco Express e Standard funcionaram da mesma forma.

    Será que não tem outro problema ai?

    Manda o execution plan também.

    Tenta usar outra máscara de data e veja se acontece a mesma coisa.

    Retorne os testes.

    • Marcado como Resposta Eve0904 quarta-feira, 28 de dezembro de 2011 22:16
    terça-feira, 27 de dezembro de 2011 13:38
  • Eve

    somente para teste execute o script abaixo

     SELECT distinct idVenda, SUM(Quant) as Itens, SUM((PrecoVenda-Desconto)*Quant) as  Valor
                   FROM vw_VendasDia
                WHERE convert(varchar(8),DataVenda,112)='20111219'
            GROUP BY idVenda
            ORDER BY idVenda
    

     


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Eve0904 quarta-feira, 28 de dezembro de 2011 22:16
    terça-feira, 27 de dezembro de 2011 16:48

Todas as Respostas

  • Bom dia  Eve0904,

    O que vc quiz dizer em " mostrando as datas como se TODAS fossem a solicitada (não chega a alterar os registros originais, só mostra errado). " ? A data está sendo mostrada em um formato errado?

    Você jah verificou a "language" do seu servidor express? O que pode estar contecendo é por exemplo, ele estar configurado para "brazilian" onde o formato da data é 21/12/2011 e não 2011/12/21. Para testar esta suposição, no Express coloque em sua query o SET DATEFORMAT YMD antes do seu select.

     

    Atenciosamente,
    Rafael Melo 

     
     


     

    quinta-feira, 22 de dezembro de 2011 12:33
  • Rafael,

    O resultado da query no meu SQL seria algo assim:

    idVenda   Itens     Valor
    104            2           25
    105            1           2,85

     

    No SQL Express, ele mostra TODOS os registros:

    idVenda   Itens     Valor
    1   1           1,98
    2                3           5,6
    (...)e todos os outros registros...
    104            2           25
    105            1           2,85

    Inseri o campo DataVenda no select distinct para ver o que estava acontecendo e isso aparecia:

    idVenda   DataVend                      Itens       Valor
    1 21/12/2011 00:00:00      1           1,98
    2              21/12/2011 00:00:00      3           5,6
    (...)e todos os outros registros...
    104          21/12/2011 00:00:00      2           25
    105          21/12/2011 00:00:00      1           2,85 

     

    Se faço um select "simples" na view (Select * from vw_VendasDia), ele me retorna as datas corretas, assim:

    idVenda   DataVend                      Quant       PrecoVenda   Desconto
    1 14/11/2011 00:00:00      1                 1,98               0
    2              14/11/2011 00:00:00      1                  0,6                0
    2              14/11/2011 00:00:00      1                  2,9                0
    2              14/11/2011 00:00:00      1                  2,1                0 
    (...)e todos os outros registros...
    104          21/12/2011 00:00:00      1                  10,1             0,1
    104          21/12/2011 00:00:00      1                  15                  0
    105          21/12/2011 00:00:00      1                  2,85               0

     

    Então... não se trata de formatação da data. Essa parte está ok. Eu processo a data antes de submeter a pesquisa, que tem que ser submetida no formato 'yyyy/mm/dd' (apesar do banco MOSTRAR no formato 'dd/mm/yyyy').

    Ele realmente está mostrando a DATA errada, como se todas que estão nos registros fossem a data solicitada!!!

    Se faço um select 'simples' com "WHERE" (SELECT * FROM vw_VendasDia WHERE DataVenda='2011/12/21') o resultado também é correto, só retorna os registros com a data solicitada: 

    idVenda   DataVend                      Quant       PrecoVenda   Desconto
    104          21/12/2011 00:00:00      1                  10,1             0,1
    104          21/12/2011 00:00:00      1                  15                  0
    105          21/12/2011 00:00:00      1                  2,85               0  

    Por isso digo que o select 'distinct' não está ALTERANDO os registros, mas por algum motivo maluco ele 'lê' todas as datas dos registros como se fossem a data solicitada e 'mostra' como se fosse essa a data estivesse gravada neles....

    MUITO estranho, não?

    quinta-feira, 22 de dezembro de 2011 13:28
  • Eve, manda o create ta tua tabela e uns dois inserts para cada uma para fazermos um teste.

    Esta situação não deveria ser problema independente da versão, não existe limitação no motor do banco de dados é o mesmo para Express, Enterprise ou Standard.

     


    quinta-feira, 22 de dezembro de 2011 19:52
  • Oi Marcus,

     

    Eu também acho que não deveria acontecer, por isso meu 'susto' quando vi um monte de páginas de resultado num relatório que deveria ter só uma... aff.

    Aqui vai o que pediu:

     

    CREATE TABLE Vendas(
    [idVenda] [int] IDENTITY(1,1) NOT NULL,
    [DataVenda] [datetime] NULL,
    [idCliente] [int] NULL,
    [idVendedor] [int] NULL,
     CONSTRAINT [PK_Vendas] PRIMARY KEY CLUSTERED 

     

     

     

    INSERT INTO Vendas  (DataVenda, idCliente, idVendedor)
            VALUES ('2011/12/15',1,1)

    INSERT INTO Vendas  (DataVenda, idCliente, idVendedor)
            VALUES ('2011/12/15',1,4)

    INSERT INTO Vendas  (DataVenda, idCliente, idVendedor)
            VALUES ('2011/12/15',1,3)

    INSERT INTO Vendas  (DataVenda, idCliente, idVendedor)
            VALUES ('2011/12/19',1,1)

    INSERT INTO Vendas  (DataVenda, idCliente, idVendedor)
            VALUES ('2011/12/19',1,1)

    INSERT INTO Vendas  (DataVenda, idCliente, idVendedor)
            VALUES ('2011/12/19',1,4)

     

     

     

    CREATE TABLE ItemVenda(
    [idItemVenda] [int] IDENTITY(1,1) NOT NULL,
    [idVenda] [int] NULL,
    [idProduto] [int] NULL,
    [Quant] [float] NULL,
    [PrecoVenda] [money] NULL,
    [Desconto] [money] NULL,
    [CodigoBarras] [varchar](20) NULL,
     CONSTRAINT [PK_ItemVenda] PRIMARY KEY CLUSTERED 
    )

     

     

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (1, 1999, 1, 10.50, 0, '000')

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (2, 1999, 1, 0.50, 0, '000')

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (3, 1999, 1, 0.80, 0, '000')

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (4, 1999, 3, 9.90, 0, '000')

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (4, 1999, 1, 30, 0, '000')

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (5, 1999, 2, 10.50, 0, '000')

    INSERT INTO ItemVenda  (idVenda, idProduto, Quant, PrecoVenda, Desconto,                 CodigoBarras)
            VALUES  (6, 1999, 1, 1.20, 0, '000')

     

    CREATE VIEW vw_VendasDia
                      AS
               SELECT ItemVenda.idItemVenda, Vendas.idVenda, Vendas.DataVenda, ItemVenda.Quant, ItemVenda.PrecoVenda, ItemVenda.Desconto
                  FROM ItemVenda
         INNER JOIN Vendas ON ItemVenda.idVenda = Vendas.idVenda

     

    SELECT * FROM vw_VendasDia WHERE DataVenda='2011/12/19'

     

    SELECT distinct idVenda, SUM(Quant) as Itens, SUM((PrecoVenda-Desconto)*Quant) as  Valor
                   FROM vw_VendasDia
                WHERE DataVenda='2011/12/19'
            GROUP BY idVenda
            ORDER BY idVenda

     

    No banco de dados que uso tem outras tabelas vinculadas e Foreign Keys (idVendedor, idCliente, etc), mas para propósito de teste acho que não precisa...

    Obrigada pela ajuda!

     

    sexta-feira, 23 de dezembro de 2011 14:03
  • Olá Eve, para ti ocorreu o problema com os exemplos que tu me passou?

    Fiz um exemplo com banco Express e Standard funcionaram da mesma forma.

    Será que não tem outro problema ai?

    Manda o execution plan também.

    Tenta usar outra máscara de data e veja se acontece a mesma coisa.

    Retorne os testes.

    • Marcado como Resposta Eve0904 quarta-feira, 28 de dezembro de 2011 22:16
    terça-feira, 27 de dezembro de 2011 13:38
  • Eve

    somente para teste execute o script abaixo

     SELECT distinct idVenda, SUM(Quant) as Itens, SUM((PrecoVenda-Desconto)*Quant) as  Valor
                   FROM vw_VendasDia
                WHERE convert(varchar(8),DataVenda,112)='20111219'
            GROUP BY idVenda
            ORDER BY idVenda
    

     


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Eve0904 quarta-feira, 28 de dezembro de 2011 22:16
    terça-feira, 27 de dezembro de 2011 16:48
  • Marcelo e Marcus,

    Fui hoje no cliente para obter o Execution Plan (o defeito só acontecia na máquina dele, com o SQL Express, lembram?) e testar o select modificado.

    Para minha surpresa, o select original desta vez retornou os resultados esperados!

    Vai entender...

    O que quer que estivesse gerando o problema, parece ter sumido.

    Ah, e Marcelo, seu select também funcionou muito bem, mas para usar no programa teria que modificar o tratamento dado na data obtida pelo DatePicker (usei o Delphi para programar), e como o select original voltou a funcionar, deixei como estava por enquanto.

    Agradeço MUITO a força e ficarei de olho. Se algo estranho acontecer de novo posto aqui o Execution plan, ok?

    Um FELIZ 2012!

     

    Evelyne

    quarta-feira, 28 de dezembro de 2011 22:16