2010-04-12 9 views
6

Ho questo valore '0310D45'SQL Server 2005 IsNumeric non cattura '0310D45'

sto usando IsNumeric per verificare se i valori sono numerici prima della colata a un bigint. Sfortunatamente questo valore sta superando il controllo numerico. Quindi la mia query non sta dicendo:

Msg 8114, Level 16, State 5, Line 3 
Error converting data type varchar to bigint. 

Qual è il modo più semplice per gestire questo. Stavo pensando di usare charindex ma dovrei controllare tutte e 26 le lettere.

C'è una soluzione semplice che non vedo? Non voglio davvero creare una funzione definita dall'utente.

Grazie

risposta

9

Date un'occhiata a questo articolo di nome What is wrong with IsNumeric()? che contiene il seguente estratto:

Premessa: la funzione di T-SQL ISNUMERIC() ha un problema. Può interpretare erroneamente le lettere e i simboli non numerici (come D, E e £) e anche le lettere (CHAR (9)) come valori numerici.

Sfortunatamente sembra che IsNumeric sia semplicemente strano e dovrai scrivere alcune righe di T-SQL per aggirare il problema. (Con strano voglio dire che se i dati valutati possono essere convertiti in qualsiasi tipo numerico a tutti, l'otterrà convertito.)

4

Recentemente ho affrontato questo problema ed ero alla ricerca di una soluzione. Penso di averne trovato due, e volevo postarli qui in modo che sia più facile per gli altri trovarli. prima soluzione è quella di usare l'espressione e SQLServer regolare la funzione PATINDEX()

IF PATINDEX('%[^0-9]%', @testString) = 0 

Seconda soluzione è quella di concatenare una stringa 'e0' alla stringa di test e ancora usare la funzione SQLServer ISNUMERIC() con la stringa concatenata. ISNUMERIC non riesce a rilevare la presenza di caratteri come d, e, x a causa delle diverse notazioni usate nei formati numerici, ma consente comunque solo un singolo carattere. Quindi concatenare 'e0' impedisce alla funzione di darti un falso vero, quando mai richiesto.

IF (ISNUMERIC (@testString + 'e0') = 1) 

Spero che questo aiuti

Problemi correlati