2010-07-05 6 views
3

J'ai la procédure stockée suivante.Requête SQL date null check

ALTER PROCEDURE [dbo].[spList_Report] 
    @id INT, 
    @startDate DATETIME = NULL, 
    @endDate DATETIME = NULL, 
    @includeStatus1 BIT, 
    @includeStatus2 BIT, 
    @includeStatus3 BIT, 
    @includeStatus4 BIT 

AS 
    SET NOCOUNT ON 

    SELECT * 
    FROM 
    tblProducts as products 
    WHERE 
    product.intID = @id 
    AND product.dateMain >= @startDate 
    AND product.dateMain <= @endDate 

Je sais que cela semble probablement une question stupide, mais si @StartDate ET @EndDate sont tous deux nuls alors je veux qu'il revienne les lignes en ignorant la vérification de la date dans la clause where.

Toute aide serait grandement appréciée.

Répondre

6

Cela devrait faire

AND product.dateMain >= ISNULL(@startDate, 0) 
AND product.dateMain <= ISNULL(@endDate, product.dateMain + 1) 

ISNULL cède la deuxième valeur, si la première valeur est nulle.

Ainsi:

si @startDate est nul, alors dateMain doit être plus grand que 0 (1900-01-01)

si @endDate est nul, alors dateMain doit être inférieure à dateMain + 1 day

+0

+1. Même que ma réponse (supprimée) est meilleure :) –

+0

Merci, fonctionne parfaitement –

2
vous

peut essayer quelque chose comme ceci

ALTER PROCEDURE [dbo].[spList_Report] 
    @id INT, 
    @startDate DATETIME = NULL, 
    @endDate DATETIME = NULL, 
    @includeStatus1 BIT, 
    @includeStatus2 BIT, 
    @includeStatus3 BIT, 
    @includeStatus4 BIT 

AS 
    SET NOCOUNT ON 

    SELECT * 
    FROM 
    tblProducts as products 
    WHERE 
    product.intID = @id 
    AND product.dateMain >= ISNULL(@startDate, product.dateMain) 
    AND product.dateMain <= ISNULL(@endDate, product.dateMain) 
0

Vous pouvez utiliser un "ou" dans votre Sql, mais étant donné que cela est une procédure stockée:

If @startdate is null Or @enddate is null 
    begin 
     select without using a date range 
    end 
Else 
    begin 
     select using date range 
    end 
+0

c'est beaucoup de duplication, cependant, pour quelque chose pour lequel il y a des solutions plus simples (Lieven, IordanTanev et moi obtenons tous la même solution) –

0

J'utiliser la solution de Kris Krause, mais changer le « si » à utiliser « ET ». Je pense que si vous utilisez les deux premières solutions, le moteur de recherche peut effectuer une analyse de table/index sur les champs de date. Vous voulez garder vos requêtes aussi concises que possible pour de meilleures performances, donc n'exécutez pas de requêtes sur des colonnes inutiles.

IF @startdate IS NULL AND @enddate IS NULL 
BEGIN 
    SELECT * FROM tblProducts as products WHERE 
    product.intID = @id 
END 
ELSE 
BEGIN 
    SELECT * FROM tblProducts as products WHERE 
    product.intID = @id 
    AND product.dateMain >= @startDate 
    AND product.dateMain <= @endDate 
END