2016-11-14 147 views
2

我有這樣的查詢:無效長度參數

CASE 
    WHEN ISNUMERIC(SUBSTRING(dbo.Post.OdaSayisi, 1, CHARINDEX('+', dbo.Post.OdaSayisi) - 1)) = 1 
     THEN SUBSTRING(dbo.Post.OdaSayisi, 1, CHARINDEX('+', dbo.Post.OdaSayisi) - 1) 
     ELSE 0 
END AS RoomNumber, 

其中OdaSayisi就像3 + 1,4 + 2的字符串。當我嘗試寫這個查詢時:

SELECT * 
FROM [myDB].[dbo].[MyView] 
WHERE RoomNumber = 3 

我在標題中出現此錯誤。我怎樣才能解決這個問題?謝謝。

+1

問題是你有行或NULL或不包含'+'符號。 –

+0

@RaduGheorghiu那麼,我該怎麼做? – jason

回答

4

問題是OdaSayisi的某些值在其中沒有'+'。最簡單的辦法是把一個在爲CHARINDEX()功能

(CASE WHEN ISNUMERIC(SUBSTRING(dbo.Post.OdaSayisi, 1, CHARINDEX('+', dbo.Post.OdaSayisi + '+') - 1)) = 1 
     THEN SUBSTRING(dbo.Post.OdaSayisi, 1, CHARINDEX('+', dbo.Post.OdaSayisi + '+') - 1) 
     ELSE 0 
END) AS RoomNumber, 

+ '+'確保CHARINDEX()不會返回一個負數。

+0

'+'+''當列包含NULL時,這將返回NULL。 (服務器設置適用)。所以這在這種情況下無濟於事。 – Pred

+2

@Pred。 。 。如果任何參數都是NULL,則substring()返回NULL。問題是由'CHARINDEX()'找不到字符造成的負長度參數。 –

1

CHARINDEX

如果任expressionToFind或expressionToSearch是NULL,CHARINDEX返回NULL。 如果沒有內expressionToSearch發現expressionToFind,CHARINDEX返回0

SUBSTRING

編號是基於1的,也就是說,在表達式中的第一個字符是1

0

您需要首先測試字段[dbo.Post.OdaSayisi]是否爲空,然後評估字段中是否存在「+」。

CASE WHEN ISNULL(dbo.Post.OdaSayisi, '!Zz!') <> '!Zz!' 
THEN 
    CASE WHEN CHARINDEX('+', dbo.Post.OdaSayisi), 1) > 0 
    THEN 
    CASE WHEN ISNUMERIC(SUBSTRING(dbo.Post.OdaSayisi, 1, CHARINDEX('+', dbo.Post.OdaSayisi) - 1)) = 1 
     THEN 
      SUBSTRING(dbo.Post.OdaSayisi, 1, CHARINDEX('+', dbo.Post.OdaSayisi) - 1) 
    ELSE 0 
     END 
    ELSE 0 
    END 
ELSE 0 
END AS RoomNumber, 

希望這可以幫助。