Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Określa zachowanie standardu ISO dla kilku warunków błędu.
Transact-SQL konwencje składni
Składnia
Syntax for SQL Server, serverless SQL pool in Azure Synapse Analytics, Microsoft Fabric
SET ANSI_WARNINGS { ON | OFF }
Syntax for Azure Synapse Analytics and Analytics Platform System (PDW)
SET ANSI_WARNINGS ON
Uwagi
SET ANSI_WARNINGS wpływa na następujące warunki:
Po ustawieniu na ON, jeśli wartości zerowe pojawiają się w funkcjach agregowanych, takich jak SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP lub COUNT, generowany jest komunikat ostrzegawczy. Po ustawieniu OFF nie pojawia się żadne ostrzeżenie.
Po ustawieniu na ON, błędy dzielenia przez zero i przepełnienia arytmetycznego powodują, że instrukcja jest cofana i generowany jest komunikat o błędzie. Po ustawieniu na WYŁĄCZONE, błędy dzielenia przez zero i przelewu arytmetycznego powodują zwracanie wartości zerowych. Zachowanie, w którym błąd dzielenia przez zero lub arytmetycznego przepełnienia powoduje zwracanie wartości zerowych, występuje, gdy próba wykonania INSERT lub UPDATE zostanie wykonana na znaku, Unicode lub kolumnie binarnej , w której długość nowej wartości przekracza maksymalny rozmiar kolumny. Jeśli SET ANSI_WARNINGS jest WŁĄCZONY, INSERT lub UPDATE zostaje anulowany zgodnie ze standardem ISO. Puste miejsca końcowe są ignorowane dla kolumn znaków, a null-y końcowe dla kolumn binarnych. Gdy jest WYŁĄCZONY, dane są obcięte do rozmiaru kolumny i zdanie odnosi sukces.
Uwaga / Notatka
Gdy następuje obcięcie w konwersji na lub z danych binarnych lub warbinaryjnych , nie jest wydawane żadne ostrzeżenie ani błąd, niezależnie od opcji SET.
Uwaga / Notatka
ANSI_WARNINGS nie jest respektowany przy przekazywaniu parametrów w procedurze przechowywanej, funkcji zdefiniowanej przez użytkownika lub przy deklarowaniu i ustawianiu zmiennych w instrukcji wsadowej. Jeśli na przykład zmienna jest zdefiniowana jako char(3), a następnie ustawiona na wartość większą niż trzy znaki, dane zostaną obcięte do zdefiniowanego rozmiaru, a instrukcja INSERT lub UPDATE zakończy się powodzeniem.
Możesz użyć opcji sp_configure użytkownika, aby ustawić domyślne ustawienia dla ANSI_WARNINGS dla wszystkich połączeń z serwerem. Więcej informacji można znaleźć w sp_configure (Transact-SQL).
ANSI_WARNINGS musi być WŁĄCZONE, gdy tworzysz lub manipulujesz indeksami na kolumnach obliczeniowych lub widokach indeksowanych. Jeśli SET ANSI_WARNINGS jest wyłączone, instrukcje create, update, insert i DELETE na tabelach z indeksami w kolumnach obliczeniowych lub widokach indeksowanych nie wydadzą się. Aby uzyskać więcej informacji o wymaganych ustawieniach opcji SET z indeksowanymi widokami i indeksami w obliczonych kolumnach, zobacz "Rozważania przy użyciu instrukcji SET" w SET Statements (Transact-SQL).
SQL Server zawiera opcję ANSI_WARNINGS bazy danych. Jest to równoważne z SET ANSI_WARNINGS. Gdy SET ANSI_WARNINGS jest włączony, pojawiają się błędy lub ostrzeżenia w formie dziel przez zero, ciąg ciągów zbyt dużych na kolumnę bazy danych oraz inne podobne błędy. Gdy USTAW ANSI_WARNINGS jest WYŁĄCZONE, te błędy i ostrzeżenia nie są wyświetlane. Domyślna wartość w bazie model danych dla SET ANSI_WARNINGS to WYŁĄCZONE. Jeśli nie jest to określone, obowiązuje setting ANSI_WARNINGS. Jeśli SET ANSI_WARNINGS jest WYŁĄCZONE, SQL Server używa wartości kolumny is_ansi_warnings_on w widoku katalogu sys.databases .
Ważne
ANSI_WARNINGS powinno być ustawione na ON do wykonywania rozproszonych zapytań.
Klienci, tacy jak sterownik SQL Server Native Client ODBC, SQL Server Native Client OLE DB Provider dla SQL Server oraz Microsoft JDBC Driver for SQL Server, automatycznie ustawiają ANSI_WARNINGS na ON za pomocą flagi połączenia. Można to skonfigurować w źródłach danych ODBC, w atrybutach połączenia ODBC, ustawić w aplikacji przed połączeniem. Domyślnie dla SET ANSI_WARNINGS jest WYŁĄCZONE dla połączeń z DB-Library aplikacji. Dodatkowe informacje można znaleźć w specyfikacji protokołu LOGIN7 w protokole Tabular Data Stream (TDS).
Gdy ANSI_DEFAULTS jest WŁĄCZONE, ANSI_WARNINGS jest włączone.
Ustawienie ANSI_WARNINGS jest definiowane w czasie wykonywania lub wykonywania, a nie w czasie parsowania. Jak wszystkie instrukcje SET, SET ANSI_WARNINGS wpływa na bieżącą sesję.
Jeśli SET ARITHABORT lub SET ARITHIGNORE są WYŁĄCZONE, a SET ANSI_WARNINGS włączone, SQL Server nadal zwraca komunikat o błędzie przy wystąpieniu błędów dzielenia przez zero lub przepełnienia.
Aby zobaczyć aktualne ustawienie dla tego ustawienia, uruchom następujące zapytanie.
DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';
SELECT @ANSI_WARN AS ANSI_WARNINGS;
Permissions
Wymaga członkostwa w publicznej roli .
Przykłady
Poniższy przykład pokazuje trzy wcześniej wspomniane sytuacje, z SET ANSI_WARNINGS na ON i OFF.
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
Teraz ustaw ANSI_WARNINGS na ON i przetestuj.
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
Teraz ustaw ANSI_WARNINGS na WYŁĄCZ i przetestuj.
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;