Aracılığıyla paylaş


SET ANSI_NULLS (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

EŞIT () ve Eşit Değil (=<>) karşılaştırma işleçlerinin SQL Server'daki değerlerle NULL kullanıldığında ISO uyumlu davranışını belirtir.

  • SET ANSI_NULLS ON- değerinin hem hem de {expression} = NULL{expression} <> NULL değerinin False olduğu {expression}gibi NULL değerlendirir. Bu davranış ANSI uyumludur.
  • SET ANSI_NULLS OFF- değerinin {expression} = NULLTrue olduğu gibi {expression} <> NULL ve False şeklinde {expression} değerlendirirNULL. Bu davranış önerilmez, çünkü NULL değerler ve = işleçleri kullanılarak <> karşılaştırılmamalıdır.

Uyarı

SET ANSI_NULLS OFF ANSI_NULLS OFF ve veritabanı seçeneği kullanım dışıdır. SQL Server 2017 (14.x) ile başlayarak ANSI_NULLS her zaman ON olarak ayarlanır. Kullanım dışı bırakılan özellikler yeni uygulamalarda kullanılmamalıdır. Daha fazla bilgi için bkz. SQL Server 2017'de Kullanım Dışı Veritabanı Altyapısı özellikleri.

Transact-SQL söz dizimi kuralları

Sözdizimi

SQL Server için söz dizimi, Azure Synapse Analytics'te sunucusuz SQL havuzu, Microsoft Fabric

SET ANSI_NULLS { ON | OFF }

Azure Synapse Analytics ve Analytics Platform Sistemi (PDW) için söz dizimi

SET ANSI_NULLS ON

Açıklamalar

ON olduğundaANSI_NULLS, kullanan SELECT bir WHERE column_name = NULL deyim, column_name NULL değerleri olsa bile sıfır satır döndürür. kullanan bir deyim, SELECT NULL olmayan değerler olsa bile sıfır satır döndürür.WHERE column_name <> NULL

ANSI_NULLS KAPALI olduğunda, Eşittir (=) ve Eşit Değil (<>) karşılaştırma işleçleri ISO standardına uymaz. SELECT kullanan WHERE column_name = NULL bir deyim, column_name null değerleri olan satırları döndürür. SELECT kullanan WHERE column_name <> NULL bir deyim, sütunda değerleri olmayanNULL satırları döndürür. Ayrıca kullanan bir SELECT deyim WHERE column_name <> XYZ_value , XYZ_value olmayan ve olmayan NULLtüm satırları döndürür.

ON olduğunda ANSI_NULLS , null değerle yapılan tüm karşılaştırmalar BİlİNMEYEN olarak değerlendirilir. KAPALI olduğunda SET ANSI_NULLS , tüm verilerin null değerle karşılaştırılması, veri değeri ise NULLTRUE olarak değerlendirilir. Belirtilmezse SET ANSI_NULLS , geçerli veritabanı seçeneğinin ayarı ANSI_NULLS uygulanır. Veritabanı seçeneği hakkında ANSI_NULLS daha fazla bilgi için bkz. ALTER DATABASE (Transact-SQL).

Aşağıdaki tabloda ayarının ANSI_NULLS null ve null olmayan değerler kullanan Boole ifadelerinin sonuçlarını nasıl etkilediği gösterilmektedir.

Boole İfadesi ANSI_NULLS AÇIN ANSI_NULLS KAPATMA
NULL = NULL BİLİNMEYEN DOĞRU
1 = NULL BİLİNMEYEN YANLIŞ
NULL <> NULL BİLİNMEYEN YANLIŞ
1 <> NULL BİLİNMEYEN DOĞRU
NULL > NULL BİLİNMEYEN BİLİNMEYEN
1 > NULL BİLİNMEYEN BİLİNMEYEN
NULL IS NULL DOĞRU DOĞRU
1 IS NULL YANLIŞ YANLIŞ
NULL IS NOT NULL YANLIŞ YANLIŞ
1 IS NOT NULL DOĞRU DOĞRU

SET ANSI_NULLS ON bir karşılaştırmayı yalnızca karşılaştırmanın işlenenlerinden biri olan bir değişken NULL veya değişmez değer NULLolduğunda etkiler. Karşılaştırmanın her iki tarafı da sütun veya bileşik ifadeyse, ayar karşılaştırmayı etkilemez.

Bir betiğin ANSI_NULLS amaçlandığı gibi çalışması için, veritabanı seçeneğinden veya ayarından SET ANSI_NULLSbağımsız olarak null değerler içerebilecek karşılaştırmalarda ve IS NULL kullanınIS NOT NULL.

ANSI_NULLS dağıtılmış sorguları yürütmek için ON olarak ayarlanmalıdır.

ANSI_NULLS hesaplanan sütunlarda veya dizinlenmiş görünümlerde dizin oluştururken veya değiştirirken de ON olmalıdır. SET ANSI_NULLS KAPALI ise, hesaplanan sütunlarda veya dizinlenmiş görünümlerde dizinleri olan tablolardaki tüm CREATE, UPDATE, INSERTDELETE ve deyimleri başarısız olur. SQL Server, gerekli değerleri ihlal eden tüm SET seçeneklerini listeleyen bir hata döndürür. Ayrıca, off ise SELECT bir SET ANSI_NULLS deyimi yürütürken, SQL Server hesaplanan sütun veya görünümlerdeki dizin değerlerini yoksayar ve tablolarda veya görünümlerde böyle dizinler yokmuş gibi seçme işlemini çözümler.

Uyarı

ANSI_NULLS , hesaplanan sütunlarda veya dizinlenmiş görünümlerde dizinlerle ilgilenirken gerekli değerlere ayarlanması gereken yedi SET seçeneğinden biridir. , , ANSI_PADDING, ANSI_WARNINGSARITHABORTve QUOTED_IDENTIFIER seçenekleri CONCAT_NULL_YIELDS_NULLde ON olarak ayarlanmalıdır ve NUMERIC_ROUNDABORT KAPALI olarak ayarlanmalıdır.

SQL Server için SQL Server Yerel İstemci ODBC sürücüsü ve SQL Server Yerel İstemci OLE DB Sağlayıcısı bağlanırken otomatik olarak AÇILDI olarak ayarlanır ANSI_NULLS . Bu ayar, SQL Server örneğine bağlanmadan önce ODBC veri kaynaklarında, ODBC bağlantı özniteliklerinde veya uygulamada ayarlanan OLE DB bağlantı özelliklerinde yapılandırılabilir. için SET ANSI_NULLS varsayılan değer KAPALI'dır.

ON olduğunda ANSI_DEFAULTS etkindir ANSI_NULLS .

ayarı ANSI_NULLS , ayrıştırma zamanında değil yürütme veya çalışma zamanında tanımlanır.

Bu ayarın geçerli ayarını görüntülemek için aşağıdaki sorguyu çalıştırın:

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS;   

İzinler

"" genel "" rolüne üyelik gerektirir.

Örnekler

Aşağıdaki örnek, veya = ile ve değişkendeki değerle <> karşılaştırma yapmak için EşittirNULL () ve 0 Eşit Değil (null) karşılaştırma işleçlerini kullanır.

SET ANSI_NULLS OFF
DECLARE @var INT = NULL
SELECT
    IIF(@var = NULL,  'True', 'False') as EqualNull,
    IIF(@var <> NULL, 'True', 'False') as DifferentNull,
    IIF(@var = 0,     'True', 'False') as EqualZero,
    IIF(@var <> 0,    'True', 'False') as DifferentZero

Sonuçlar aşağıdaki tabloda gösterilir.

EşitBoş FarklıNull Eşit Sıfır Farklı Sıfır
Doğru Yanlış Yanlış Doğru

Tüm SET ANSI_NULLS ON ifadeler 'False' olarak değerlendirilir çünkü NULL bu işleçlerle NULL karşılaştırılamaz veya 0 kullanılamaz.

Aşağıdaki örnek, bir tablodaki ve null olmayan değerlerle = karşılaştırma yapmak için Eşittir<> () ve Eşit Değil (NULL) karşılaştırma işleçlerini kullanır. Örnekte ayarın 'yi SET ANSI_NULLS etkilemediği IS NULLde gösterilmektedir.

-- Create table t1 and insert values.  
CREATE TABLE dbo.t1 (a INT NULL);  
INSERT INTO dbo.t1 values (NULL),(0),(1);  
GO  
  
-- Print message and perform SELECT statements.  
PRINT 'Testing default setting';  
DECLARE @varname int;   
SET @varname = NULL;  
  
SELECT a  
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO 

Şimdi ANSI_NULLS ON ve test olarak ayarlayın.

PRINT 'Testing ANSI_NULLS ON';  
SET ANSI_NULLS ON;  
GO  
DECLARE @varname int;  
SET @varname = NULL  
  
SELECT a   
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  

Şimdi ANSI_NULLS KAPALI ve test olarak ayarlayın.

PRINT 'Testing ANSI_NULLS OFF';  
SET ANSI_NULLS OFF;  
GO  
DECLARE @varname int;  
SET @varname = NULL;  
SELECT a   
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  
  
-- Drop table t1.  
DROP TABLE dbo.t1;