2011-09-13 15 views
11

Recentemente stavo lavorando con ISNUMERIC in SQL Server, quando ho riscontrato un problema, che ha portato a trovare questo snippet di codice.Perché ISNUMERIC ('.') Restituisce 1?

SELECT ISNUMERIC('.') 

Questo restituisce 1, come in vero, non dovrebbe restituire 0 come in falso?

+0

no. 1.1 è numerico. ISNUMERIC()) è molto semplice, si potrebbe anche dire stupido ... quindi considera un punto numerico. –

+2

per quello che riguarda ',' funziona anche (molte impostazioni locali lo usano come divisore decimale) – Unsliced

risposta

16

Vedere IsNumeric() Broken? Only up to a point.

SELECT CAST('.' AS MONEY) 

rendimenti 0.00 (se il cast non riesce per int e float)

ISNUMERIC solo controlla che il valore può essere lanciato una qualsiasi delle tipi di dati numerici che è generalmente inutile. Di solito vuoi sapere se può essere lanciato su un tipo specifico.

Additionally it doesn't even seem to do that task correctly for all possible inputs.. ISNUMERIC(' ') restituisce 0 nonostante sia stato eseguito correttamente il casting sia in int che in denaro. Al contrario, ISNUMERIC(N'8') restituisce 1 ma non esegue correttamente il cast di tutto ciò che ho provato.

Alcune utili funzioni di supporto sono disponibili qui IsNumeric, IsInt, IsNumber.

SQL Server 2012 ha introdotto TRY_PARSE e TRY_CONVERT che aiutano notevolmente.

+3

esattamente. Considerate la pendenza scivolosa: '10' è ok,' 10.0' è ok, '10.' è ok ... (_avvio a slide_) quindi' .1' dovrebbe essere ok ... e '.0' e .. . sì '.' è ok anche. [Essere generoso nell'input parsing] (https://plus.google.com/114034641416688387662/posts/8bJZnLFxAfi) ha i suoi lati negativi a volte. – sehe

+0

Grazie per quello, rotola su Denali! –

1

Perché "." è usato in un numero decimale!

vedere here

IsNumeric per '-' & '' Perché isnumeric ('-') & isnumeric ('.') Restituisce 1?

Risposta: Perché "-" significa negativo e "." è utilizzato in un numero decimale . Non ho idea del perché lo abbiano chiamato ISNUMERICO però. Lo avrebbe dovuto chiamarlo, ISNUMBERRELATED.