2010-06-06 80 views
1

我有一個動態構建查詢的存儲過程。與此查詢關聯的where子句基於用戶選擇的過濾器值。不管我做什麼,where子句似乎都沒有設置。SQL Server 2005 - 構建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 

@whereClause從不打印任何東西。反過來,LEN(@whereClause)始終爲NULL。 @isVegan和@hasSpouse值被傳遞給存儲過程。這些值是我所期望的。

我在做什麼錯?爲什麼不設置@whereClause?

謝謝你的幫助!

謝謝!

回答

6

首先初始化,有些東西+ NULL始終是NULL

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

好吧,如果@Hasspouse比-1,則沒有這些東西會打不大於。另外,如果你沒有@WhereClause設置爲任何東西,然後空+文字=空

我建議您檢查@HasSpouse,並在這一切的頂部添加 SET @WhereClause =「」

2

我倒是初始化WHERE子句與1=1所以一切之後是串聯與‘AND’和它永遠不會空

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,不需要在SQL周圍條件括號。它是不是C#

+0

+1:我的情緒正好,尤其是支架... – 2010-06-06 19:25:37