none
Select dinamico com data nao retorna .... RRS feed

  • Pergunta

  • Bom dia
    Pessoal seguinte tenho a procedure abaixo :


    CREATE PROCEDURE [dbo].[Pagamentos_Procura]
    (
        @P_NomeRazaoSocialCliente        nvarchar(100)  = NULL    ,       
        @P_NomeRazaoSocialParceiro      nvarchar(100)  = NULL   
        @P_DataInicial                             datetime       = NULL    ,
        @P_DataFinal                               datetime        = NULL
    )
    AS
    BEGIN
         DECLARE @V_And  nvarchar(100)

         --Procura pelo NomeRazao do cliente.
         IF (dbo.g4_Anula(@P_NomeRazaoSocialCliente) IS NOT NULL)
          SET @V_And = ' AND C.NomeRazao LIKE ''%' + (@P_NomeRazaoSocialCliente)+
                       '%'' AND C.CkCliente = ''S'' ';

         --Procura pelo NomeRazao do parceiro.
         IF (dbo.g4_Anula(@P_NomeRazaoSocialParceiro) IS NOT NULL)
          SET @V_And = ' AND C.NomeRazao LIKE ''%' + (@P_NomeRazaoSocialParceiro)+
                       '%'' AND C.CkParceiro = ''S'' ';

        IF (@P_DataInicial) > (@P_DataFinal)
         RAISERROR('A data inicial deve ser menor ou igual a data final.',12,1);

         --Procura atravez da data de pagamento um periodo estipulado pelo usuario.
         IF ((@P_DataInicial)IS NOT NULL AND (@P_DataFinal) IS NOT NULL )
          SET @V_And = ' AND P.DataPagamento  BETWEEN ' + CONVERT(NVARCHAR(30),@P_DataInicial,103) +
         ' AND ' + CONVERT(NVARCHAR(30),@P_DataFinal,103) ;
               
         EXEC(' SELECT TOP 30
        P.Id_Pagamento,
        P.Id_CadastroCliente,
        C.NomeRazao AS Cadastros_Nome,
        P.Id_CadastroPlanoCliente,
        P.Id_CadastroParceiro,
        P.Id_CondicaoPagamento,
         CP.Nome AS CondicoesPagamentos_Nome,
        P.DataPagamento,
        P.Valor,
        P.NumParcelaParceiro,
        P.NumParcelaCliente
         FROM
            Pagamentos P , CondicoesPagamento CP    , Cadastros C 
         WHERE
            P.Id_CondicaoPagamento = CP.Id_CondicaoPagamento
         AND
            P.Id_CadastroCliente   = C.Id_Cadastro ' + @V_And);

         SET NOCOUNT ON;
         RETURN;
    END;

    Quando executo a procedure com um periodo de uma determinanda data que tem registro no banco, simplesmente a procedure não me retorna nenhum registro. Ela executa sem erros mais não me traz o resultado esperado.
    Alguem pode me ajudar ... ja tentei de tudo mais não funcionou ainda ...

    Obrigado,
    quinta-feira, 27 de dezembro de 2007 11:54

Todas as Respostas

  • Bom Dia,

     

    Ao invés de rodar o EXEC, capture o retorno usando o PRINT. Ao passar as datas, possivelmente alguma configuração de datas está alterando a forma com que elas são interpretadas. Certifique-se de colocar o SET DATEFORMAT YMD (ou SET DATEFORMAT DMY) juntamente com sua sql dinâmica.

     

    Não é uma boa prática colocar CONVERT para converter datas em cláusula WHERE. Essa prática pode tornar os índices nesse campo (se houver) menos eficientes para recuperar resultados. Dessa forma, ao invés de usar:

     

    SELECT * FROM TABELA

    WHERE CONVERT(CHAR(10),Data,103) BETWEEN 'Data1' AND 'Data2'

     

    Use

     

    SET DATEFORMAT YMD

    SELECT * FROM TABELA

    WHERE Data BETWEEN 'Data1 00:00:00' AND 'Data2 23:59:59.999'

     

    [ ]s,

     

    Gustavo

    quinta-feira, 27 de dezembro de 2007 12:06
  • Danilo,

     

    A solução do nosso amigo Gustavo foi satisfatória?? Se não foi avisa que tento te ajudar também.

     

    Abraço,

     

    chapolin.rio@gmail.com

    quinta-feira, 27 de dezembro de 2007 16:39
  • Boa tarde Chapolin

     Desculpa a demora na resposta fiquei meio ausente ....

    Então não me ajudou muito não a resposta do nosso amigo ... não sei se eu entendi errado ou se no meu caso não vai da certo desta maneira ....

    Eu não entendi como vou fazer deste modo :

    SET DATEFORMAT YMD

    SELECT * FROM TABELA

    WHERE Data BETWEEN 'Data1 00:00:00' AND 'Data2 23:59:59.999'


    Se eu estou usuando parametros ... se tiver outra maneira de fazer e queria tabém uma opinião da maneira que eu fiz esta procedure se é a mais indicada ou não ...


    Uma solução que eu cheguei mais não resolveu nada foi esta:


         IF ((@P_DataInicial)IS NOT NULL AND (@P_DataFinal) IS NOT NULL )
          SET @V_And = ' AND P.DataPagamento  BETWEEN ' + CONVERT(NVARCHAR(30),'@P_DataInicial 00:00:00',103)    +   ' AND ' + CONVERT(NVARCHAR(30),'@P_DataFinal 23:59:59.999',103) ;


    apresenta o seguinte erro:


    Msg 137, Level 15, State 2, Line 22
    Must declare the variable '@P_DataInicial'.


    Eu também colocoquei o comando SET DATEFORMAT YMD   mais de nada resolveu  ....



    Obrigado pela atenção,




    sexta-feira, 28 de dezembro de 2007 16:10
  • Danilo,

     

    Tenta essa aqui. Pode parecer que não mudou nada, mas mudei sim. Copia e cola e depois me avisa.

     

    Abraço

     

    chapolin.rio@gmail.com

     

     

     

    CREATE PROCEDURE [dbo].[Pagamentos_Procura]

    (

    @P_NomeRazaoSocialCliente nvarchar(100) = NULL ,

    @P_NomeRazaoSocialParceiro nvarchar(100) = NULL

    @P_DataInicial datetime = NULL ,

    @P_DataFinal datetime = NULL

    )

    AS

    BEGIN

    DECLARE @V_And nvarchar(100)

    --Procura pelo NomeRazao do cliente.

    IF (dbo.g4_Anula(@P_NomeRazaoSocialCliente) IS NOT NULL)

    SET @V_And = ' AND C.NomeRazao LIKE ''%' + (@P_NomeRazaoSocialCliente)+

    '%'' AND C.CkCliente = ''S'' ';

    --Procura pelo NomeRazao do parceiro.

    IF (dbo.g4_Anula(@P_NomeRazaoSocialParceiro) IS NOT NULL)

    SET @V_And = ' AND C.NomeRazao LIKE ''%' + (@P_NomeRazaoSocialParceiro)+

    '%'' AND C.CkParceiro = ''S'' ';

    IF (@P_DataInicial) > (@P_DataFinal)

    RAISERROR('A data inicial deve ser menor ou igual a data final.',12,1);

    --Procura atravez da data de pagamento um periodo estipulado pelo usuario.

    IF ((@P_DataInicial)IS NOT NULL AND (@P_DataFinal) IS NOT NULL )

    SET @V_And = ' AND P.DataPagamento BETWEEN ''' + CONVERT(NVARCHAR(30),@P_DataInicial,103) +

    ''' AND ' + CONVERT(NVARCHAR(30),@P_DataFinal,103) ;

    EXEC(' SELECT TOP 30

    P.Id_Pagamento,

    P.Id_CadastroCliente,

    C.NomeRazao AS Cadastros_Nome,

    P.Id_CadastroPlanoCliente,

    P.Id_CadastroParceiro,

    P.Id_CondicaoPagamento,

    CP.Nome AS CondicoesPagamentos_Nome,

    P.DataPagamento,

    P.Valor,

    P.NumParcelaParceiro,

    P.NumParcelaCliente

    FROM

    Pagamentos P , CondicoesPagamento CP , Cadastros C

    WHERE

    P.Id_CondicaoPagamento = CP.Id_CondicaoPagamento

    AND

    P.Id_CadastroCliente = C.Id_Cadastro ' + @V_And);

    SET NOCOUNT ON;

    RETURN;

    END;

    sexta-feira, 28 de dezembro de 2007 16:28
  • Opa..

     

     No CONVERT substitua o 103 pelo 112 fazendo o favor!!!!!!!!

     

    sexta-feira, 28 de dezembro de 2007 16:29
  • tenta fazer o seguite.. converter a data do banco tb

     

     

     

    IF ((@P_DataInicial)IS NOT NULL AND (@P_DataFinal) IS NOT NULL )
          SET @V_And = ' AND Convert(varchar,P.DataPagamento,103) >= ' + CONVERT(NVARCHAR(30),@P_DataInicial,103)+ ' AND Convert(varchar,P.DataPagamento,103) <= ' + CONVERT(NVARCHAR(30),@P_DataFinal,103)

     

    Veja se te ajuda

    []s

    sexta-feira, 28 de dezembro de 2007 16:30
  • Ricardo e Chapolin muito obrigado pela ajuda de vcs ... deu certo !!!

    So mais uma questão desta maneira usando o CONVERT eu perco muito desempenho da minha procedure ?

    Obrigado mesmo ,



    sexta-feira, 28 de dezembro de 2007 16:47
  • Danilo,

     

    Certamente usando uma função a mais em uma condição ocorrerá uma queda de performance em relação a uma consulta pura. Isso é notório. Nosso amigo Gustavo colocou uma parêntese sobre o risco para os índices. Sendo assim caso tenha índice, segudo ele não é muito recomendado. Porém em casos de query dinâmica o uso de convert me parece inevitável. Agora não acredito que a perda de desempenho pelo uso do convert seja tão preocupante assim. Se vc usar o CONVERT 112 Evita de converter o campo da tabela também. Dessa forma existe ganho en relação ao CONVERT 103 pois teria que converter o campo e a variável.

     

    Espero ter ajudado,

     

    Abraços,

     

    chapolin.rio@gmail.com

    sexta-feira, 28 de dezembro de 2007 16:53
  • Entendio Chapolin

    Obrigado pela ajuda mais uma vez ...

    Abrs,
    sexta-feira, 28 de dezembro de 2007 17:05