2014-09-24 68 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來執行語句。