Ecco cinque opzioni per gestire il messaggio di errore 8134 "Dividi per zero errore riscontrato" in SQL Server.
L'errore
Innanzitutto, ecco un esempio di codice che produce l'errore di cui stiamo parlando:
SELECT 1 / 0;
Risultato:
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
Otteniamo l'errore perché stiamo cercando di dividere un numero per zero. Matematicamente, questo non ha alcun senso. Non puoi dividere un numero per zero e aspettarti un risultato significativo.
Per far fronte a questo errore, dobbiamo decidere cosa dovrebbe essere restituito quando proviamo a dividere per zero. Ad esempio, potremmo voler restituire un valore nullo. Oppure potremmo volere che zero venga restituito. O qualche altro valore.
Di seguito sono riportate alcune opzioni per gestire questo errore.
Opzione 1:NULLIF()
Espressione
Un modo semplice e veloce per gestire questo errore è usare NULLIF()
espressione:
SELECT 1 / NULLIF( 0, 0 );
Risultato:
NULL
NULLIF()
restituisce NULL
se le due espressioni specificate hanno lo stesso valore. Restituisce la prima espressione se le due espressioni sono diverse. Pertanto, se utilizziamo zero come seconda espressione, otterremo un valore nullo ogni volta che la prima espressione è zero. Dividendo un numero per NULL
risulta in NULL
.
In realtà, SQL Server restituisce già NULL
su un errore di divisione per zero, ma nella maggior parte dei casi non lo vediamo, a causa del nostro ARITHABORT
e ANSI_WARNINGS
impostazioni (ne parleremo più avanti).
Opzione 2:aggiungi ISNULL()
Funzione
In alcuni casi, potresti preferire restituire un valore diverso da NULL
.
In questi casi, puoi passare l'esempio precedente a ISNULL()
funzione:
SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);
Risultato:
0
Qui ho specificato che zero dovrebbe essere restituito ogni volta che il risultato è NULL
.
Stai attento però. In alcuni casi, restituire zero potrebbe essere inappropriato. Ad esempio, se hai a che fare con scorte di magazzino, specificare zero potrebbe implicare che non ci sono prodotti, il che potrebbe non essere il caso.
Opzione 3:usa un CASE
Dichiarazione
Un altro modo per farlo è usare un CASE
dichiarazione:
DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;
SELECT CASE
WHEN @n2 = 0
THEN NULL
ELSE @n1 / @n2
END
Risultato:
NULL
Opzione 4:il SET ARITHABORT
Dichiarazione
Il SET ARITHABORT
termina una query quando si verifica un errore di overflow o divisione per zero durante l'esecuzione della query. Possiamo usarlo insieme a SET ANSI WARNINGS
per restituire NULL
ogni volta che potrebbe verificarsi l'errore di divisione per zero:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;
Risultato:
NULL
Microsoft consiglia di impostare sempre ARITHABORT
su ON
nelle tue sessioni di accesso e che impostandolo su OFF
può avere un impatto negativo sull'ottimizzazione delle query, causando problemi di prestazioni.
Alcuni client (come SQL Server Management Studio) impostano ARITHABORT
su ON
per impostazione predefinita. Questo è il motivo per cui probabilmente non vedi il NULL
valore restituito quando si divide per zero. Puoi usare SET ARITHIGNORE
per modificare questo comportamento se preferisci.
Opzione 5:SET ARITHIGNORE
Dichiarazione
Il SET ARITHIGNORE
L'istruzione controlla se i messaggi di errore vengono restituiti da errori di overflow o di divisione per zero durante una query:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SET ARITHIGNORE ON;
SELECT 1 / 0 AS Result_1;
SET ARITHIGNORE OFF;
SELECT 1 / 0 AS Result_2;
Risultato:
Commands completed successfully. Commands completed successfully. Commands completed successfully. +------------+ | Result_1 | |------------| | NULL | +------------+ (1 row affected) Commands completed successfully. +------------+ | Result_2 | |------------| | NULL | +------------+ Division by zero occurred.
Qui ho impostato ARITHABORT
e ANSI_WARNINGS
su OFF
in modo che l'istruzione non sia stata interrotta a causa dell'errore e NULL
viene restituito ogni volta che si verifica un errore di divisione per zero.
Nota che il SET ARITHIGNORE
l'impostazione controlla solo se viene restituito un messaggio di errore. SQL Server restituisce un NULL
in un calcolo che comporta un errore di overflow o divisione per zero, indipendentemente da questa impostazione.
Nell'esempio sopra possiamo vederlo quando ARITHIGNORE
è ON
, l'errore di divisione per zero non viene restituito. Quando è OFF
, viene restituito il messaggio di errore di divisione per zero.