STÄLL ANSI_WARNINGS (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Microsoft Fabric

Specificerar ISO-standardbeteende för flera felförhållanden.

Transact-SQL syntaxkonventioner

Syntax

Syntax for SQL Server, serverless SQL pool in Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Syntax för Azure Synapse Analytics and Analytics Platform System (PDW)

SET ANSI_WARNINGS ON

Anmärkningar

SET ANSI_WARNINGS påverkar följande villkor:

  • När den sätts till ON, om nullvärden förekommer i aggregerade funktioner, såsom SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP eller COUNT, genereras ett varningsmeddelande. När den är inställd på AV ges ingen varning.

  • När den sätts till ON orsakar divide-med-noll- och aritmetiska överflödesfel att satsen rullas tillbaka och ett felmeddelande genereras. När den sätts till AV orsakar divide-med-noll- och aritmetiska överflödesfel att nollvärden returneras. Beteendet där ett del-med-noll eller aritmetiskt överflödesfel orsakar nollvärden uppstår om en INSERT eller UPDATE försöks på ett tecken, en Unicode- eller binärkolumn där längden på ett nytt värde överstiger kolumnens maximala storlek. Om SET ANSI_WARNINGS är PÅ avbryts INSERT eller UPDATE enligt ISO-standarden. Efterföljande blanka punkter ignoreras för teckenkolumner och efterföljande nollpunkter ignoreras för binära kolumner. När den är AV avkortas data till kolumnens storlek och satsen lyckas.

Anmärkning

När trunkering sker vid någon konvertering till eller från binär eller varbinär data ges ingen varning eller fel, oavsett SET-alternativ.

Anmärkning

ANSI_WARNINGS respekteras inte vid överföring av parametrar i en lagrad procedur, användardefinierad funktion eller vid deklarering och inställning av variabler i en batchsats. Om en variabel till exempel definieras som tecken(3) och sedan anges till ett värde som är större än tre tecken trunkeras data till den definierade storleken och INSERT- eller UPDATE-instruktionen lyckas.

Du kan använda användaralternativen för sp_configure att ställa in standardinställningen för ANSI_WARNINGS för alla anslutningar till servern. För mer information, se sp_configure (Transact-SQL).

ANSI_WARNINGS måste vara PÅ när du skapar eller manipulerar index på beräknade kolumner eller indexerade vyer. Om SET ANSI_WARNINGS är av, kommer skapa, uppdatera, infoga och DELETE-satser på tabeller med index på beräknade kolumner eller indexerade vyer att misslyckas. För mer information om nödvändiga inställningar för SET-alternativ med indexerade vyer och index på beräknade kolumner, se "Considerations When You Use the SET Statements" i SET Statements (Transact-SQL).

SQL Server inkluderar alternativet ANSI_WARNINGS databas. Detta motsvarar SET ANSI_WARNINGS. När SET ANSI_WARNINGS är PÅ höjs fel eller varningar i delning med noll, sträng som är för stor för databaskolumnen och andra liknande fel. När STÄLL ANSI_WARNINGS är AV, väcks inte dessa fel och varningar. Standardvärdet i databasen model för SET ANSI_WARNINGS är AV. Om det inte specificeras gäller inställningen ANSI_WARNINGS. Om SET ANSI_WARNINGS är FEL använder SQL Server värdet i kolumnen is_ansi_warnings_on i sys.databases-katalogvyn .

Viktigt!

ANSI_WARNINGS bör vara inställd på ON för att köra distribuerade frågor.

Klienter, såsom SQL Server Native Client ODBC-drivrutinen, SQL Server Native Client OLE DB Provider för SQL Server och Microsoft JDBC Driver för SQL Server sätter automatiskt ANSI_WARNINGS till ON med en anslutningsflagga. Detta kan konfigureras i ODBC-datakällor, i ODBC-anslutningsattribut, som ställs in i applikationen innan anslutning. Standardinställningen för SET ANSI_WARNINGS är AVSTÄNGD för anslutningar från DB-Library applikationer. För ytterligare information, se LOGIN7 i Tabular Data Stream (TDS)-protokollspecifikationerna.

När ANSI_DEFAULTS är PÅ är ANSI_WARNINGS aktiverat.

Inställningen av ANSI_WARNINGS definieras vid exekverings- eller körningstid och inte vid parsetid. Liksom alla SET-satser påverkar SET ANSI_WARNINGS den aktuella sessionen.

Om 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.

För att se den aktuella inställningen för denna inställning, kör följande fråga.

DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';  
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';  
SELECT @ANSI_WARN AS ANSI_WARNINGS;  

Permissions

Kräver medlemskap i offentlig roll.

Examples

Följande exempel visar de tre situationer som nämnts tidigare, där SET ANSI_WARNINGS på PÅ och AV.

CREATE TABLE T1   
(  
   a int,   
   b int NULL,   
   c varchar(20)  
);  
GO  
  
SET NOCOUNT ON;  
  
INSERT INTO T1   
VALUES (1, NULL, '')   
      ,(1, 0, '')  
      ,(2, 1, '')  
      ,(2, 2, '');  
  
SET NOCOUNT OFF;  
GO  

Ställ nu ANSI_WARNINGS på PÅ och testa.

PRINT '**** Setting ANSI_WARNINGS ON';  
GO  
  
SET ANSI_WARNINGS ON;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (3, 3, 'Text string longer than 20 characters');  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  

Ställ nu ANSI_WARNINGS på AV och testa.

PRINT '**** Setting ANSI_WARNINGS OFF';  
GO  
SET ANSI_WARNINGS OFF;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (4, 4, 'Text string longer than 20 characters');  
GO  
SELECT a, b, c   
FROM T1  
WHERE a = 4;  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  
  
DROP TABLE T1;