SQL生成错误

时间:2012-02-21 05:33:21

标签: sql-server sql-server-2008

我在经典ASP页面上使用以下SQL语法。遗憾的是HostLatitudenvarchar(20),因此是十进制转换。

SELECT 
    HostID, HostLatitude, HostLongitude, HostNames, HostPropertyName, 
    HostStreet, HostSuburb, HostCity, HostPhone, HostMobile, 
    HostLastUpdated, HostJoinDate, HostPostCode, hgbCounter, HostStateID 
FROM 
    Hosts
WHERE 
    HostLatitude IS NOT NULL
    AND Datalength(HostLatitude) > 5
    AND CONVERT(decimal, HostLatitude) > 51
    AND CONVERT(decimal, HostLatitude) < 53
    AND HostRegionID = 303
    AND HostLastUpdated >CONVERT(DATETIME, '2012-02-21 00:00:00', 102) - 730 
    AND Datalength(HostLatitude) > 2 
    AND Datalength(HostLongitude) > 1 
    AND HostApproved = 1 
    AND HostDisabled = 0 
    AND AdminDisabled = 0 
ORDER BY 
    HostID DESC;

我收到以下错误:

  

Msg 8114,Level 16,State 5,Line 1
  将数据类型nvarchar转换为数字时出错。

如果我注释掉以下内容,则运行查询:

AND CONVERT(decimal, HostLatitude) > 51
AND CONVERT(decimal, HostLatitude) < 53

2 个答案:

答案 0 :(得分:1)

这意味着HostLatitude沿线的某处填充了一些非数字字符。您可以使用CASE子句来检查ISNUMERIC()并在它不是数字时返回null或其他一些默认值

AND case when isnumeric(HostLatitude) = 1 
           then convert(decimal, HostLatitude)
           else null 
    end) > 51

答案 1 :(得分:1)

这是因为HostLatitude包含无法转换为十进制的字符串值。 例如:

  • 'ABC'
  • ''
  • 123,45