Definisi tersebut mengatakan:
Ketika SET ANSI_NULLS ON, pernyataan SELECT yang menggunakan WHERE column_name = NULL mengembalikan baris nol bahkan jika ada nilai null di column_name. Pernyataan SELECT yang menggunakan WHERE nama_kolom <> NULL mengembalikan baris nol meskipun ada nilai bukan-null dalam nama_kolom.
Apakah ini berarti tidak ada null yang akan disertakan dalam kueri ini?
SELECT Region
FROM employees
WHERE Region = @region
Atau apakah ANSI_NULL
hanya menyangkut pertanyaan seperti ini (di mana WHERE
termasuk kata tertentu NULL
)?
SELECT Region
FROM employees
WHERE Region = NULL
sql
tsql
stored-procedures
Rodniko
sumber
sumber
Jawaban:
Ini berarti bahwa tidak ada baris akan dikembalikan jika
@region
adalahNULL
, bila digunakan dalam contoh pertama Anda, bahkan jika ada baris dalam tabel di manaRegion
adalahNULL
.When
ANSI_NULLS
aktif (yang harus selalu Anda aktifkan, karena opsi untuk tidak mengaktifkannya akan dihapus di masa mendatang), operasi perbandingan apa pun di mana (setidaknya) salah satu operanNULL
menghasilkan nilai logika ketiga -UNKNOWN
( sebagai lawanTRUE
danFALSE
).UNKNOWN
nilai menyebar melalui operator boolean gabungan jika mereka belum diputuskan (misalnyaAND
denganFALSE
operan atauOR
denganTRUE
operan) atau negasi (NOT
).The
WHERE
klausul digunakan untuk menyaring hasil set dihasilkan olehFROM
klausa, sehingga nilai keseluruhan dariWHERE
klausul harusTRUE
untuk baris untuk tidak difilter. Jadi, jika suatuUNKNOWN
dihasilkan oleh perbandingan apa pun, itu akan menyebabkan baris disaring.@ user1227804 ini jawaban meliputi kutipan ini:
dari
SET ANSI_NULLS
*Namun, saya tidak yakin poin apa yang coba dibuatnya, karena jika dua
NULL
kolom dibandingkan (misalnya dalam aJOIN
), perbandingan masih gagal:create table #T1 ( ID int not null, Val1 varchar(10) null ) insert into #T1(ID,Val1) select 1,null create table #T2 ( ID int not null, Val1 varchar(10) null ) insert into #T2(ID,Val1) select 1,null select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1
Kueri di atas mengembalikan 0 baris, sedangkan:
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)
Menampilkan satu baris. Jadi meskipun kedua operan adalah kolom,
NULL
tidak samaNULL
. Dan dokumentasi untuk=
tidak menjelaskan apa pun tentang operan:Namun, 1 dan 2 salah - hasil dari kedua perbandingan adalah
UNKNOWN
.* Arti samar teks ini akhirnya ditemukan bertahun-tahun kemudian. Artinya sebenarnya, untuk perbandingan tersebut, setelan tidak berpengaruh dan selalu bertindak seolah-olah setelan AKTIF . Akan lebih jelas jika itu menyatakan bahwa
SET ANSI_NULLS OFF
itu adalah pengaturan yang tidak berpengaruh.sumber
Jika
@Region
bukan sebuahnull
nilai (katakanlah@Region = 'South'
) ia tidak akan mengembalikan baris di mana bidang Kawasan adalah nol, terlepas dari nilai ANSI_NULLS.ANSI_NULLS hanya akan membuat perbedaan jika nilai
@Region
isnull
, yaitu ketika query pertama Anda pada dasarnya menjadi yang kedua.Dalam hal ini, ANSI_NULLS ON tidak akan mengembalikan baris apa pun (karena
null = null
akan menghasilkan nilai boolean yang tidak diketahui (aliasnull
)) dan ANSI_NULLS OFF akan mengembalikan baris apa pun di mana bidang Region null (karenanull = null
akan menghasilkantrue
)sumber
Jika ANSI_NULLS disetel ke "ON" dan jika kita menerapkan =, <> pada nilai kolom NULL saat menulis pernyataan pilih maka tidak akan mengembalikan hasil apa pun.
Contoh
create table #tempTable (sn int, ename varchar(50)) insert into #tempTable values (1, 'Manoj'), (2, 'Pankaj'), (3, NULL), (4, 'Lokesh'), (5, 'Gopal')
SETEL ANSI_NULLS AKTIF
select * from #tempTable where ename is NULL -- (1 row(s) affected) select * from #tempTable where ename = NULL -- (0 row(s) affected) select * from #tempTable where ename is not NULL -- (4 row(s) affected) select * from #tempTable where ename <> NULL -- (0 row(s) affected)
NONAKTIFKAN ANSI_NULLS
select * from #tempTable where ename is NULL -- (1 row(s) affected) select * from #tempTable where ename = NULL -- (1 row(s) affected) select * from #tempTable where ename is not NULL -- (4 row(s) affected) select * from #tempTable where ename <> NULL -- (4 row(s) affected)
sumber
WHERE X IS NULL
danWHERE X = NULL
, dan bagaimana ANSI_NULLS memengaruhi hasilnya. Terlepas dari upaya para pemilih bawah yang terlalu bersemangat, INI harus menjadi jawaban yang diterima!SETEL ANSI_NULLS AKTIF
IT Mengembalikan semua nilai termasuk nilai null dalam tabel
SET ANSI_NULLS nonaktif
Itu Berakhir ketika kolom berisi nilai null
sumber
Saya kira hal utama di sini adalah:
Jangan pernah pengguna:
@anything = NULL
@anything <> NULL
@anything != null
Selalu gunakan:
@anything IS NULL
@anything IS NOT NULL
sumber
Set ANSI NULLS OFF akan membuat perbandingan NULL = NULL menjadi true. TELUR:
SET ANSI_NULLS OFF select * from sys.tables where principal_id = Null
akan mengembalikan beberapa hasil seperti yang ditampilkan di bawah ini: zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPermissions 2840564 NULL ZCWOrgLevelClientFee 4322525 NULL
Meskipun kueri ini tidak akan memberikan hasil apa pun:
SET ANSI_NULLS ON select * from sys.tables where principal_id = Null
sumber
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql
Ketika SET ANSI_NULLS ON, pernyataan SELECT yang menggunakan WHERE column_name = NULL mengembalikan baris nol bahkan jika ada nilai null di column_name. Pernyataan SELECT yang menggunakan WHERE column_name <> NULL mengembalikan baris nol meskipun ada nilai nonnull di column_name.
Misalnya
DECLARE @TempVariable VARCHAR(10) SET @TempVariable = NULL SET ANSI_NULLS ON SELECT 'NO ROWS IF SET ANSI_NULLS ON' where @TempVariable = NULL -- IF ANSI_NULLS ON , RETURNS ZERO ROWS SET ANSI_NULLS OFF SELECT 'THERE WILL BE A ROW IF ANSI_NULLS OFF' where @TempVariable =NULL -- IF ANSI_NULLS OFF , THERE WILL BE ROW !
sumber