Ho un CSV che sto importando nel nostro database. Una delle "colonne" contiene dati che devono essere essere un INT ma alcune righe hanno numeri che rientrano solo nell'intervallo BIGINT (perché sono dati di test da uno dei nostri partner). Archiviamo INT internamente e non desideriamo cambiare.SQL: downcast in modo sicuro da BIGINT a INT
Voglio downcast sicuro da BIGINT a INT. Con sicurezza, voglio dire che nessun errore dovrebbe essere sollevato se si verifica un overflow aritmetico. Se il cast/conversione ha esito positivo, voglio che il mio script vada avanti. Se fallisce, lo voglio cortocircuitare. Non riesco a capire la sintassi corretta. Questo è quello che ho:
DECLARE @UserIDBigInt BIGINT = 9723021913; -- actually provided by query param
--Setting within the INT range successfully converts
--SET @UserIDBigInt = 5;
DECLARE @UserID INT = CONVERT(INT, @UserIDBigInt);
--DECLARE @UserID INT = CAST(@UserIDBigInt AS INT);
SELECT @UserIDBigInt
SELECT @UserID
IF @UserID IS NOT NULL BEGIN
SELECT 'Handle it as reliable data'
END
Ci ho pensato a confronto @UserIDBigInt per l'intervallo valido di un INT (-2^31 (-2.147.483.648) a 2^31-1 (2,147,483,647)), ma davvero non mi piace questo approccio. Questa è la mia riserva. Speravo in alcuni costrutti linguistici o funzioni integrate che potrei usare. Se devo assolutamente confrontarmi con l'intervallo valido, ci sono almeno alcune costanti integrate (come int.MinValue di C# & int.MaxValue)?
MODIFICA: errore di battitura corretto.
Non ci sono costanti predefinite. Se dovessi finire per paragonare a costanti, quella domanda ha avuto risposta prima: http://stackoverflow.com/questions/7092774/max-value-represented-by-bigint/7092844#7092844 –
Perché non assegnare il valore a una variabile INT nella stored procedure, assegnare tale valore a una variabile BIGINT, quindi confrontare BIGINT con il valore originale (anche BIGINT).Se ci fosse un overflow che assegna a un INT, i valori non corrisponderanno. –
@Conspicuous Compiler, non ho mai detto che sto usando una stored procedure. Indipendentemente da ciò, facendo ciò solleva un "Errore di overflow aritmetico convertendo espressione in tipo di dati int". come accennato nella mia domanda iniziale. –