2010-06-06 7 views
1

J'ai une procédure stockée qui génère dynamiquement une requête. La clause where associée à cette requête est basée sur les valeurs de filtre sélectionnées par un utilisateur. Quoi que je fasse, la clause where ne semble pas être prête.SQL Server 2005 - Création d'une clause WHERE

-- Dynamically build the WHERE clause based on the filters 
DECLARE @whereClause as nvarchar(1024) 
IF (@hasSpouse > -1) 
BEGIN 
    IF (@hasSpouse = 0) 
    SET @whereClause='p.[HasSpouse]=0' 
    ELSE 
    SET @whereClause='(p.[HasSpouse]=1 OR p.[HasSpouse] IS NULL)' 
    END 

    -- Dynamically add the next filter if necessary 
    IF (@isVegan > -1) 
    BEGIN 
    IF (LEN(@whereClause) > 0) 
    BEGIN 
     SET @whereClause = @whereClause + ' AND ' 
    END 

    IF (@isVegan = 0) 
     SET @whereClause = @whereClause + 'c.[IsVegan]=0' 
    ELSE 
     SET @whereClause = @whereClause + '(c.[IsVegan]=1 OR c.[IsVegan] IS NULL)' 
    END 

    PRINT @whereClause 

La fonction @whereClause n'imprime jamais rien. À son tour, le LEN (@whereClause) est toujours NULL. Les valeurs @isVegan et @hasSpouse sont transmises dans la procédure stockée. Les valeurs sont ce que j'attendais.

Qu'est-ce que je fais mal? Pourquoi la @whereClause n'est-elle jamais définie?

Nous vous remercions de votre aide!

Merci!

Répondre

6

lsinitialisez d'abord, quelque chose + NULL est toujours NULL

DECLARE @whereClause as nvarchar(1024) 
SET @whereClause = '' 
2

Eh bien, si @Hasspouse n'est pas supérieur à -1 alors aucune de ce genre de choses va frapper. En outre, si vous n'avez pas @whereClause réglé sur quoi que ce soit alors texte null + = null

Je vous recommande de vérifier @HasSpouse et au sommet de tout cela ajoutez SET @whereClause = « »

2

I « d initialiser la clause WHERE avec 1=1 donc tout ce qui suit est concaténation avec « eT » et il est jamais NULL

DECLARE @whereClause as nvarchar(1024) 
SET @whereClause = '1=1' 

IF @hasSpouse > -1 
BEGIN 
    IF @hasSpouse = 0 
    SET @whereClause = @whereClause + ' AND p.[HasSpouse]=0' 
    ELSE 
    SET @whereClause = @whereClause + ' AND (p.[HasSpouse]=1 OR p.[HasSpouse] IS NULL)' 
END 

-- Dynamically add the next filter if necessary 
IF @isVegan > -1 
BEGIN 
    IF @isVegan = 0 
     SET @whereClause = @whereClause + ' AND c.[IsVegan]=0' 
    ELSE 
     SET @whereClause = @whereClause + ' AND (c.[IsVegan]=1 OR c.[IsVegan] IS NULL)' 
END 

PRINT @whereClause 

BTW, entre parenthèses dans les conditions ne sont pas nécessaires dans SQL. Il aint C#

+0

+1: Mes sentiments exactement, en particulier les supports ... –