Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
De SET ARITHABORT instelling bepaalt of een query stopt wanneer er een overflow- of deel-door-nul-fout optreedt tijdens de uitvoering van een query.
Wanneer je en
SET ANSI_WARNINGS OFFzetSET ARITHABORT ON, zorgen rekenkundige fouten ervoor dat de batch eindigt. Als de fouten optreden in een transactie, wordt de transactie teruggedraaid.Als zowel
SET ARITHABORTalsSET ANSI_WARNINGSzijnOFFen een rekenfout optreedt, verschijnt er een waarschuwingsbericht (tenzijSET ARITHIGNOREisON) en is het resultaat van de rekenkundige bewerking .NULL
Transact-SQL syntaxis-conventies
Syntaxis
Syntax for SQL Server, serverless SQL pool in Azure Synapse Analytics, Microsoft Fabric, SQL database in Microsoft Fabric
SET ARITHABORT { ON | OFF }
Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW)
SET ARITHABORT ON
Opmerkingen
Wanneer ANSI_WARNINGS is ON (de standaard), heeft de instelling van ARITHABORT geen functioneel effect. Rekenfouten zorgen ervoor dat de query eindigt, maar de batch stopt niet (zolang de instelling XACT_ABORT op OFFis ).
Waarschuwing
De standaardinstelling ARITHABORT voor SQL Server Management Studio (SSMS) is ON, terwijl een clientverbinding in een applicatie standaard op ARITHABORT OFF. Zelfs als er geen functioneel verschil is, zolang ANSI_WARNINGS dat is ON, blijft de ARITHABORT instelling een cache-sleutel. Daarom hebben SSMS en een applicatie die hun respectievelijke standaardinstellingen gebruiken, verschillende cache-entries en kunnen ze verschillende queryplannen krijgen, waardoor het moeilijk is om slecht presterende queries op te lossen. Dat wil zeggen, dezelfde query kan langzamer in de applicatie worden uitgevoerd dan in SSMS. Bij het oplossen van problemen met Management Studio, kies altijd de clientinstelling ARITHABORT .
Voor expressie-evaluatie, als zowel SET ANSI_WARNINGS en OFFSET ARITHABORT zijn als een INSERT, UPDATE, of DELETE statement een rekenkundige, overflow-, deel-door-nul- of domeinfout, voegt de query een waarde in of werkt deze bijNULL. Als de doelkolom niet nul is, mislukt de invoeg- of updateactie en ziet de gebruiker een foutmelding.
De instelling van SET ARITHABORT gebeurt tijdens execute- of run-tijd en niet tijdens parse.
SET ARITHABORT OFFwordt niet ondersteund in Azure Synapse Analytics dedicated SQL pools.
Permissions
Vereist lidmaatschap van de openbare rol.
Bekijk de huidige instelling van ARITHABORT
Om de huidige instelling voor SET ARITHABORTte bekijken, voer je de volgende T-SQL-query uit:
DECLARE @ARITHABORT VARCHAR(3) = 'OFF';
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';
SELECT @ARITHABORT AS ARITHABORT;
Voorbeelden
Het volgende voorbeeld toont de deel-door-nul en overloopfouten met verschillende SET ARITHABORT instellingen.
- Het script maakt voorbeeldtabellen
t1ent2voegt voorbeeldgegevenswaarden in. - Stel tests in
ANSI_WARNINGS ONen voer uit om het standaardgedrag van een deel-door-nul fout en rekenkundige overloop te zien. - Stel
ANSI_WARNINGS OFFzo in dat effectARITHABORTheeft, en stelARITHABORT ON. Voer tests uit om het gedrag te zien met een deel-door-nul fout en een rekenkundige overloop. - Stel zowel
ANSI_WARNINGS OFFalsARITHABORT OFF. Voer tests uit om het gedrag te zien met een deel-door-nul fout en een rekenkundige overloop. - Maak de voorbeeldtabellen schoon.
-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
a TINYINT,
b TINYINT
);
CREATE TABLE t2 (
a TINYINT NOT NULL
);
GO
INSERT INTO t1
VALUES (1, 0);
INSERT INTO t1
VALUES (255, 1);
GO
-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF; -- To make sure that we have the default setting for this option.
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Resulting data - should be no data';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';
GO
SET ANSI_WARNINGS OFF;
SET ARITHABORT ON;
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Resulting data - should be 0 rows';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
-- Returns NULL.
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
-- Fails with NOT NULL violation.
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
-- Fails with NOT NULL violation
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
GO
PRINT '*** Resulting data - should be 0 rows';
GO
SELECT *
FROM t2;
GO
-- Drop tables t1 and t2 and restore ANSI_WARNINGS
DROP TABLE t1;
DROP TABLE t2;
SET ANSI_WARNINGS ON
GO