Inquiridor
Select dinamico com data nao retorna ....

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,
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 TABELAWHERE
CONVERT(CHAR(10),Data,103) BETWEEN 'Data1' AND 'Data2'Use
SET
DATEFORMAT YMDSELECT
* FROM TABELAWHERE
Data BETWEEN 'Data1 00:00:00' AND 'Data2 23:59:59.999'[ ]s,
Gustavo
-
-
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,
-
Danilo,
Tenta essa aqui. Pode parecer que não mudou nada, mas mudei sim. Copia e cola e depois me avisa.
Abraço
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 30P.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
; -
-
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
-
-
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
-