2014-09-24 65 views
0
declare @sSQL VARCHAR(2000) 

SET sSQL='Select top 20 ID 
FROM Prospects 
WHERE p.StatusID not in (-1,2,4,5,6,7,8,9,12,13,14)' 
+CASE WHEN @state IS NULL THEN '' ELSE CHAR(10) + 'AND P.State = '+ CHAR(39)[email protected] +CHAR(39) end 

上面的代码块不返回任何状态值,我想维护ISNULL功能。 原来的是有像这样的where子句 - 'p.State = IsNull(@State,p.State)'使用case语句删除我的SQL查询中的ISNULL's

+1

这就是Microsoft SQL Server语法。你为什么要标记这个问题[tag:mysql]? – 2014-09-24 17:53:01

+1

coalesce比isnull更普遍'p.State = coalesce(@state,p.state)'? – xQbert 2014-09-24 17:57:24

回答

0

没有必要在varchar变量中添加查询。你可以实现它,而无需使用任何变量这样的 -

解决方案1:

SELECT TOP 20 ID 
FROM Prospects 
WHERE p.StatusID NOT IN (-1,2,4,5,6,7,8,9,12,13,14) 
    AND (
     P.STATE = @State 
     OR @State IS NULL 
     ) 

解决方案2:

SELECT TOP 20 ID 
FROM Prospects 
WHERE p.StatusID NOT IN (-1,2,4,5,6,7,8,9,12,13,14) 
    AND P.STATE = COALESCE(@State, P.STATE) 

解决方案-3:动态查询(我总是试图避免)。

SET @sSQL = 'Select top 20 ID 
FROM Prospects 
WHERE p.StatusID not in (-1,2,4,5,6,7,8,9,12,13,14)' + (
     CASE 
      WHEN @state IS NULL 
       THEN '' 
      ELSE ' AND P.State = ' + QUOTENAME(@State, '''') 
      END 
     ) 
0

尝试取消特殊字符,只是用空格代替,并把价值@State在单引号:

SET sSQL = 'Select top 20 ID 
FROM Prospects 
WHERE p.StatusID not in (-1,2,4,5,6,7,8,9,12,13,14)' + 
(CASE WHEN @state IS NULL THEN '' ELSE ' AND P.State = ''' + @State + '''' end) 

或者,您可以为这样写:

SET sSQL = 'Select top 20 ID 
FROM Prospects 
WHERE p.StatusID not in (-1,2,4,5,6,7,8,9,12,13,14)' + 
(CASE WHEN @state IS NULL THEN '' ELSE ' AND P.State = @State' end) 

并使用sp_executesql而不是exec来执行语句。