Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

5 modi per correggere l'errore "Dividi per zero" in SQL Server (Msg 8134)

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.