2016-11-14 107 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, 

希望这可以帮助。