SQL生成错误
我在传统的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
这意味着,沿线某处HostLatitude被填充了一些非数字字符。你可以使用一个CASE子句检查ISNUMERIC(),并返回null或其他一些默认值时,它不是一个数量
AND case when isnumeric(HostLatitude) = 1
then convert(decimal, HostLatitude)
else null
end) > 51
在转换为“decimal”前使用'IsNumeric'函数时要小心。 “IsNumeric”并不总是如预期的那样,它不是100%安全的转换为十进制的过滤器。见这里:http://www.simple-talk.com/community/blogs/philfactor/archive/2011/01/13/98746.aspx – 2012-02-21 06:03:13
@PhilipFourie +1好点。希望他可以采取只是清理HostLatitude的方法,并验证将来如果有什么值的话,那么在那里会有什么值。但是,如果不是,他总是可以测试边缘情况......应该不难确定它们是什么。并可能把这个逻辑放在一个sql函数中。 – 2012-02-21 06:14:57
这是因为HostLatitude
包含无法转换为十进制的字符串值。 例如:
- 'ABC'
- ''
- 123,45
看起来像表中有垃圾。我只需要找出一种方法来搜索任何非数字字符+小数点符号的记录。我会看一看。 – 2012-02-21 06:23:26
@Craig Ray:如果问题对您的问题有帮助,请考虑将其投票回答,并在您将问题引向解决方案时接受它。 – 2012-02-21 06:47:42
是什么HostLatitude价值?我认为有一些值不能转换为十进制,请检查表中HostLatitude的值。 – 2012-02-21 05:36:30
您是否认为它可能与本专栏的*内容*有关,因此可能值得向我们展示一些示例值? – 2012-02-21 05:39:56
@Damien_The_Unbeliever你是否认为,也许,如果他意识到他不需要提出这个问题;) – 2012-02-21 05:41:24