2011-09-23 11 views
5
declare @input varchar(255) = 'abc' 

select * from table where id = CAST(@input as int) 

Posso fare in modo che il cast fallisca in modo silenzioso, o predefinito su un valore fornito dall'utente (o predefinito di sistema)?SQL Server esegue correttamente il cast della stringa e fallisce in modo invisibile

+0

L'assegnazione iniziale avrà esito negativo. Volevi usare un altro tipo di dati? –

+0

haha ​​si, grazie per la cattura. Ho aggiornato la domanda di conseguenza –

risposta

12

Denali ha try_convert e try_parse funzioni.

Fino ad allora è possibile utilizzare

DECLARE @input VARCHAR(11) = 'abc' 

SELECT * 
FROM table 
WHERE id = CAST(CASE WHEN @input NOT LIKE '%[^0-9]%' THEN @input END AS INT) 

Potrebbe essere necessario modificare la prova un po '(per esempio, si impedisca interi negativi e consente di quelli positivi più grande della massima int), ma se si trova un test adeguato (e.g. the one here) e utilizzare una dichiarazione CASE per evitare errori di trasmissione in quanto l'ordine di valutazione per CASE è mostly garantito.

+1

+1 Risposta piacevole - anche i decimali delle copertine (stavo cercando la funzione ISNUMERIC) –

+0

funzionavano alla grande, grazie! –

+0

@Stormer - La tua [modifica suggerita] (http://stackoverflow.com/review/suggested-edits/5757328) non funziona. Dovrebbe solo controllare che una stringa contenga almeno un numero. Non * solo * numeri. –

1

È possibile inserire la selezione nel blocco TRY-CATCH e riemettere la query in CATCH con il valore predefinito.

Problemi correlati