Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
Avslutar en fråga när ett överflödes- eller dela-med-noll-fel uppstår under frågeexekveringen.
Transact-SQL syntaxkonventioner
Syntax
Syntax for SQL Server, serverless SQL pool in Azure Synapse Analytics, Microsoft Fabric
SET ARITHABORT { ON | OFF }
Syntax för Azure Synapse Analytics and Analytics Platform System (PDW)
SET ARITHABORT ON
Anmärkningar
Ställ alltid ARITHABORT till PÅ under dina inloggningssessioner. Att sätta ARITHABORT till AV kan påverka frågeoptimeringen negativt, vilket leder till prestandaproblem.
Varning
Standardinställningen för ARITHABORT för SQL Server Management Studio är PÅ. Klientapplikationer som sätter ARITHABORT till AVSTÄNGT kan få olika frågeplaner, vilket gör det svårt att felsöka dåligt presterande frågor. Det vill säga, samma fråga kan köras snabbt i Management Studio men långsamt i applikationen. När du felsöker frågor med Management Studio, matcha alltid klientens ARITHABORT-inställning.
När SET ARITHABORT och SET ANSI WARNINGS är PÅ, gör dessa felvillkor att frågan avslutas.
När SET ARITHABORT är PÅ och SET ANSI WARNINGS är AV, orsakar dessa felvillkor att batchen avslutas. Om felen uppstår i en transaktion rullas transaktionen tillbaka. När SET ARITHABORT är AV och ett av dessa fel uppstår, visas ett varningsmeddelande och resultatet av den aritmetiska operationen är NULL.
Om SET ARITHABORT och SET ANSI-VARNINGAR är AV och ett av dessa fel uppstår, visas ett varningsmeddelande, och resultatet av den aritmetiska operationen blir NULL.
Anmärkning
Om varken SET ARITHABORT eller SET ARITHIGNORE är PÅ, returnerar NULL SQL Server och ett varningsmeddelande visas efter att frågan körts.
När ANSI_WARNINGS har värdet ON och databasens kompatibilitetsnivå är satt till 90 eller högre, är ARITHABORT implicit ON oavsett dess värdeinställning. Om databaskompatibilitetsnivån är inställd på 80 eller tidigare måste ARITHABORT-alternativet explicit ställas in på PÅ.
För uttrycksutvärdering, om SET ARITHABORT är AV och en INSERT-, UPDATE- eller DELETE-sats stöter på ett aritmetik-, överflödes-, delnings-med-noll- eller domänfel, infogar eller uppdaterar SQL Server ett NULL värde. Om målkolumnen inte kan nullas misslyckas insättnings- eller uppdateringsåtgärden och användaren ser ett fel.
När antingen SET ARITHABORT eller SET ARITHIGNORE är AV och SET ANSI_WARNINGS är PÅ, returnerar SQL Server fortfarande ett felmeddelande vid delning med noll eller överflödesfel.
När SET ARITHABORT är AV och ett avbrytningsfel uppstår under utvärderingen av det booleska villkoret för en IF-sats, exekveras FALSE-grenen.
SET ARITHABORT måste vara PÅ när du skapar eller ändrar index på beräknade kolumner eller indexerade vyer. Om SET ARITHABORT är OFF, CREATE, UPDATE, INSERT och DELETE-satser på tabeller med index på beräknade kolumner eller indexerade vyer misslyckas.
Inställningen SET ARITHABORT sker vid exekverings- eller körningstid och inte vid parsetid.
SET ARITHABORT OFF stöds inte i dedikerade SQL-pooler i Azure Synapse Analytics.
För att se den aktuella inställningen för SET ARITHABORT, kör följande fråga:
DECLARE @ARITHABORT VARCHAR(3) = 'OFF';
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';
SELECT @ARITHABORT AS ARITHABORT;
Permissions
Kräver medlemskap i offentlig roll.
Examples
Följande exempel visar de delnings- och överflödesfel som har SET ARITHABORT inställningar.
-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
a TINYINT,
b TINYINT
);
CREATE TABLE t2 (
a TINYINT
);
GO
INSERT INTO t1
VALUES (1, 0);
INSERT INTO t1
VALUES (255, 1);
GO
PRINT '*** SET ARITHABORT ON';
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON;
GO
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
GO
PRINT '*** Resulting data - should be no data';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO
-- This works properly.
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
GO
-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
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.
DROP TABLE t1;
DROP TABLE t2;
GO