2012-02-21 151 views
1

我在传统的ASP页面上使用以下SQL语法。 HostLatitude不幸是nvarchar(20),因此十进制转换。SQL生成错误

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
Error converting data type nvarchar to numeric.

如果我注释掉下面的查询运行:

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

是什么HostLatitude价值?我认为有一些值不能转换为十进制,请检查表中HostLatitude的值。 – 2012-02-21 05:36:30

+0

您是否认为它可能与本专栏的*内容*有关,因此可能值得向我们展示一些示例值? – 2012-02-21 05:39:56

+0

@Damien_The_Unbeliever你是否认为,也许,如果他意识到他不需要提出这个问题;) – 2012-02-21 05:41:24

回答

1

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

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

在转换为“decimal”前使用'IsNumeric'函数时要小心。 “IsNumeric”并不总是如预期的那样,它不是100%安全的转换为十进制的过滤器。见这里:http://www.simple-talk.com/community/blogs/philfactor/archive/2011/01/13/98746.aspx – 2012-02-21 06:03:13

+0

@PhilipFourie +1好点。希望他可以采取只是清理HostLatitude的方法,并验证将来如果有什么值的话,那么在那里会有什么值。但是,如果不是,他总是可以测试边缘情况......应该不难确定它们是什么。并可能把这个逻辑放在一个sql函数中。 – 2012-02-21 06:14:57

1

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

  • 'ABC'
  • ''
  • 123,45
+0

看起来像表中有垃圾。我只需要找出一种方法来搜索任何非数字字符+小数点符号的记录。我会看一看。 – 2012-02-21 06:23:26

+0

@Craig Ray:如果问题对您的问题有帮助,请考虑将其投票回答,并在您将问题引向解决方案时接受它。 – 2012-02-21 06:47:42