2012-02-15 8 views
7

mi chiedevo come utilizzare IsNumeric in SQL, è un po 'diverso da VBScript, ma penso di essere stato in grado di ottenere intorno ad esso, vale a dire:con se IsNumeric come argomento

IF 1 = ISNUMERIC('5675754674') 
BEGIN 
... 
END 

questo sarebbe un modo intorno ad esso? Quello che voglio veramente fare è:

IF ISNUMERIC('5675754674') 
BEGIN 
... 
END 

ma che dà un errore. L'esempio 1 sembra funzionare, ma solo assicurandomi di farlo bene, non sono riuscito a trovare alcuna buona risorsa online.

risposta

14

Non c'è boolean in SQL Server. Questo significa che non puoi dire semplicemente IF (expression); devi confrontarlo con qualcosa, perché restituisce true o false nello stesso senso in cui probabilmente sei abituato in altre lingue.

solo una preferenza, ma io preferirei di scrivere in questo modo:

IF ISNUMERIC('5675754674') = 1 
BEGIN 
... 
END 

Non c'è modo in SQL Server per evitare il confronto a 1, come nel tuo secondo esempio.

anche come un a parte si deve essere consapevoli dei punti deboli del ISNUMERIC() - può dare falsi positivi per i valori "numerici", come ., CHAR(9), e, $ e una miriade di altre stringhe non numerici. Se volete sapere se qualcosa è un numero intero, per esempio, per meglio dire:

IF '5675754674' NOT LIKE '%[^0-9]%' 
BEGIN 
... 
END 

Ma anche questo non è un test completo e valido perché restituirà true per i valori > (2^32)-1 e tornerà false per negativi valori.

altro aspetto negativo di ISNUMERIC() è che restituisca true se il valore può essere convertito in qualsiasi dei tipi numerici, che non è la stessa di tutti tipi numerici. Spesso le persone eseguono il test per ISNUMERIC() e quindi provano a trasmettere uno FLOAT a SMALLINT e la conversione non riesce.

In SQL Server 2012 si avrà un nuovo metodo chiamato TRY_CONVERT() che restituisce NULL se la conversione al tipo di dati specificato non è valida.

5

Hai ragione, ISNUMERICO() restituisce un int. È possibile controllare la documentazione: ISNUMERIC()

2

Il IF istruzione in SQL richiede un'espressione booleana dopo la IF - vedi the MSDN reference here.

SQL non è il migliore nel gestire la fusione tra i tipi senza usare qualcosa come CAST() o CONVERT(), che significa che il valore intISUNUMERIC() rendimenti verrà risolto come booleano solo quando si utilizza un comparatore (=, <,>, ecc.) per produrre un risultato vero/falso.

IF ISNUMERIC('5675754674') = 1 è probabilmente il modo migliore per scrivere questo in TSQL: descrive chiaramente l'intento di "Se questo valore eseguito attraverso questa funzione restituisce 1 (può essere valutato come un tipo di dati numerico), quindi fare questa cosa.'

Con questo in mente, si dovrebbe essere consapevoli del fatto che ISNUMERIC controlla solo che il valore che si passa valuterà in qualsiasi tipo di dati numerico disponibile. Questo può creare problemi se i dati che stai attraversando contengono notazioni scientifiche o altre irregolarità; vedi here per ulteriori informazioni.