2012-02-21 168 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