SQL Produire une erreur

J'utilise la syntaxe SQL suivante sur une page ASP classique. HostLatitude est malheureusement un nvarchar(20) , d'où la conversion décimale.

 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; 

Je reçois l'erreur suivante:

Msg 8114, niveau 16, état 5, ligne 1
Erreur lors de la conversion du type de données nvarchar en numérique.

Si je commente ce qui suit la requête s'exécute:

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

Cela signifie que quelque part le long de la ligne HostLatitude est rempli de caractères non numériques. Vous pouvez utiliser une clause CASE pour vérifier ISNUMERIC () et renvoyer une valeur nulle ou une autre valeur par défaut lorsque ce n'est pas un nombre

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

Cela arrive parce que HostLatitude contient une valeur de string qui ne peut pas être convertie en décimal. Par exemple:

  • 'abc'
  • ''
  • 123,45