Eu tenho um procedimento que leva, entre outras coisas, parâmetros de data inicial e final. Esses dois parâmetros são entradas opcionais e o padrão é NULL. O que eu gostaria de fazer é modificar uma das SELECT
declarações atuais para que, se as datas de início e término forem fornecidas, ela retorne apenas os resultados entre essas duas datas. Eu considerei apenas jogar um CASE WHEN...
na WHERE
declaração, mas isso é confuso e não parece certo. Essa é a maneira apropriada de lidar com isso ou há algo mais eficiente?
SELECT
Cláusula existente :
SELECT do.OrdrNmbr AS 'Order Number',
mb.BOLNmbr AS 'BOL Number',
do.DlvryDt AS 'Deliver Date',
mh.Text3 AS 'Truck',
do.DlvrdQntty AS 'Gallons Delivered',
ba.BANme AS 'Carier Business Associate'
FROM dbo.DeliveryOrder AS do WITH (NOLOCK)
INNER JOIN dbo.ManifestBOL AS mb WITH (NOLOCK)
ON do.OrdrNmbr = mb.OrdrNmbr
INNER JOIN dbo.BusinessAssociate AS ba WITH (NOLOCK)
ON do.CrrrBAID = ba.BAID
INNER JOIN SRA.dbo.MovementDocument as md WITH (NOLOCK)
ON md.MvtDcmntExtrnlDcmntNbr = 'DOD' + CONVERT(VARCHAR, mb.OrdrNmbr)
INNER JOIN SRA.dbo.MovementHeader AS mh WITH (NOLOCK)
ON mh.MvtHdrMvtDcmntID = md.MvtDcmntID
WHERE mb.OrdrNmbr = @OrderNumber;
e as datas de início/término seriam executadas em do.DlvryDt
.
PS Eu sei que os nomes das tabelas/colunas são horríveis, mas este é um aplicativo de terceiros no qual a consulta está sendo executada.
Supondo que sua data de início e data de término sejam comparadas com DlvryDt na tabela DeliveryOrder, sugiro usar um valor de data muito baixo para a data de início e um valor de data muito alto para a data de término nos casos em que essas variáveis de data são nulas. Consulte a consulta a seguir.
Eu testei a resposta de Binaya Regmi e funcionou, mas também encontrei uma postagem no blog que me ajudou a desenvolver, o que eu acho, é uma solução melhor.
http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/
Eu adicionei
para a cláusula where e tudo funciona bem.