2016-11-07 111 views
0
過濾

嗨,我有過濾器在我的SQL過程是這樣的:IIF在動態where條件在SQL

IF (@LastLoginStartDate IS NOT NULL) 
    BEGIN 
     SET @sqlFilters = @sqlFilters + 'AND IIF(DPL.[LastLoginDate]=''0001-01-01 00:00:00.0000000'',''1901-01-01 00:00:00.0000000'',DPL.[LastLoginDate]) >= @LastLoginStartDateUTC '; 
    END 

但這返回我的錯誤。那麼我怎樣才能把價值1901-01-01放在像0001-01-01這樣的價值上,並與參數@LastLoginStartDateUTC比較呢?

錯誤我收到:

Msg 102, Level 15, State 1, Line 115 
Incorrect syntax near 'IIF'. 
+0

標記您正在使用的dbms。 (該代碼遠離ANSI SQL ...) – jarlh

+3

並顯示出現錯誤的行*。這條線看起來合理,所以我加倍錯誤在那裏。 –

+1

單獨的代碼會引發完全不同的錯誤。你應該發佈一些代碼來重現你的錯誤。我假設你有一些瘋狂的動態SQL正在進行,並且你有一個太少或太多的'''符號。或者...您的兼容級別可能不是SQL 2012.運行以查找:'SELECT name,compatibility_level FROM sys.databases'。對於2012年(使用'IIF')你的數據庫應該是110或更高。 –

回答

2

IIF在Access中使用,但不是有效的SQL Server。相反,您應該使用如下所示的CASE語法:

AND CASE WHEN DPL.[LastLoginDate]='0001-01-01 00:00:00.0000000' 
     THEN '1901-01-01 00:00:00.0000000 ' 
     ELSE DPL.[LastLoginDate] 
    END >= @LastLoginStartDateUTC 
+0

自從2012年以來,'IIF'是有效的SQL Server。它被當作'CASE WHEN'場景的簡寫,並帶有所有限制'CASE WHEN'具有。 https://msdn.microsoft.com/en-us/library/hh213574.aspx – Jens

+1

如果這真正解決了您的問題,那麼您需要再邁出一步並理解原因。您指出錯誤的版本或您的兼容級別不正確。 –