2016-11-07 110 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

如果这真正解决了您的问题,那么您需要再迈出一步并理解原因。您指出错误的版本或您的兼容级别不正确。 –