SQL सर्वर में, "ANSI_NULLS ON" का क्या अर्थ है?


92

परिभाषा कहती है:

जब SET ANSI_NULLS चालू होता है, तो एक सेलेक्ट स्टेटमेंट जिसमें WHERE column_name = NULL का उपयोग किया जाता है, भले ही column_name में शून्य मान हों, फिर भी शून्य पंक्तियों को वापस करता है। एक सेलेक्ट स्टेटमेंट जिसमें WHERE column_name <> का उपयोग किया जाता है, भले ही column_name में गैर-शून्य मान हों, फिर भी शून्य पंक्तियों को वापस करता है।

क्या इसका मतलब यह है कि इस क्वेरी में कोई नल शामिल नहीं होगा?

SELECT Region
FROM employees
WHERE Region = @region

या ANSI_NULLचिंता केवल इस तरह की है (जहां WHEREविशिष्ट शब्द शामिल है NULL)?

SELECT Region
FROM employees
WHERE Region = NULL

1
क्या उत्तर पहले से ही आधिकारिक दस्तावेज के 4 वें पैराग्राफ में नहीं है, जिसमें से आपने 1 पैराग्राफ की प्रतिलिपि बनाई है, जो है: -> "ANSI_NULLS सेट करें केवल एक तुलना को प्रभावित करता है यदि तुलना के ऑपरेंड में से कोई एक चर है जो पूर्ण है या एक शाब्दिक NULL। यदि तुलना के दोनों पक्ष स्तंभ या यौगिक अभिव्यक्तियाँ हैं, तो सेटिंग तुलना को प्रभावित नहीं करती है। "
user1451111

जवाबों:


68

इसका मतलब है कि यदि कोई भी पंक्ति अगर लौटा दी जाएगी @regionहै NULLजब अपने पहले उदाहरण में प्रयुक्त भले ही मेज जहां में पंक्तियों कर रहे हैं, Regionहै NULL

जब ANSI_NULLSचालू हो (जिसे आपको हमेशा किसी भी तरह सेट करना चाहिए, क्योंकि यह नहीं होने का विकल्प भविष्य में हटा दिया जाएगा), कोई भी तुलनात्मक ऑपरेशन जहां (कम से कम) एक ऑपरेंड में NULLसे तीसरा लॉजिक मान उत्पन्न होता है - UNKNOWN( के रूप में विरोध किया TRUEऔर FALSE)।

UNKNOWNमान किसी भी बूलियन ऑपरेटरों के माध्यम से प्रचारित करते हैं यदि वे पहले से तय नहीं किए जाते हैं (जैसे ANDएक FALSEऑपरेंड के ORसाथ या एक TRUEऑपरेंड के साथ ) या नकारात्मक ( NOT)।

WHEREखंड फिल्टर करने के लिए परिणाम सेट द्वारा उत्पादित किया जाता है FROMखंड, ऐसा है कि के कुल मूल्य WHEREखंड होना चाहिए TRUEपंक्ति के लिए फिल्टर नहीं किया जा करने के लिए। इसलिए, यदि कोई UNKNOWNकिसी तुलना द्वारा निर्मित होता है , तो यह पंक्ति को फ़िल्टर करने का कारण बनेगा।


@ user1227804 के उत्तर में यह उद्धरण शामिल है:

यदि तुलना के दोनों किनारे स्तंभ या यौगिक अभिव्यक्ति हैं, तो सेटिंग तुलना को प्रभावित नहीं करती है।

से *SET ANSI_NULLS

हालाँकि, मुझे यकीन नहीं है कि यह किस बिंदु को बनाने की कोशिश कर रहा है, क्योंकि अगर दो NULLस्तंभों की तुलना की जाती है (उदाहरण के लिए JOIN), तो तुलना अभी भी विफल रहती है:

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

उपरोक्त क्वेरी 0 पंक्तियों को लौटाती है, जबकि:

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)

एक पंक्ति लौटाता है। तो जब दोनों ऑपरेंड कॉलम होते हैं, तब NULLभी नहीं के बराबर होता है NULL। और ऑपरेंड के बारे में कहने के लिए प्रलेखन के= पास कुछ भी नहीं है:

जब आप दो NULLअभिव्यक्तियों की तुलना करते हैं, तो परिणाम ANSI_NULLSसेटिंग पर निर्भर करता है :

यदि ANSI_NULLSसेट किया गया है ON, तो एएनएसआई सम्मेलन के बाद परिणाम NULL1 है , जो कि NULL(या अज्ञात) मूल्य दूसरे NULLया अज्ञात मूल्य के बराबर नहीं है ।

यदि ANSI_NULLSनिर्धारित किया जाता है OFF, तो NULLतुलना की जाती NULLहै TRUE

NULLएक गैर- NULLमूल्य की तुलना में हमेशा FALSE2 का परिणाम होता है ।

हालांकि, 1 और 2 दोनों गलत हैं - दोनों तुलनाओं का परिणाम है UNKNOWN


* इस पाठ का गूढ़ अर्थ अंततः वर्षों बाद खोजा गया था। वास्तव में इसका क्या मतलब है, उन तुलनाओं के लिए, सेटिंग का कोई प्रभाव नहीं है और यह हमेशा कार्य करता है जैसे कि सेटिंग चालू थी । स्पष्ट होगा यदि यह कहा SET ANSI_NULLS OFFगया था कि सेटिंग थी जिसका कोई प्रभाव नहीं था।


1
इसलिए अगर मैं आपको सही समझता हूं: यह "व्हेयर रीजन = @ ब्रेक्शन" वाक्यांश के परिणाम को प्रभावित करता है और न केवल तब जब मैं विशेष रूप से "व्हेयर रीजन = नल" लिखता हूं?
रोड्निको

7

यदि @Regionकोई nullमान नहीं है (कहता है @Region = 'South') यह उन पंक्तियों को नहीं लौटाएगा जहाँ ANSI_NULLS के मान के बिना क्षेत्र फ़ील्ड शून्य है।

ANSI_NULLS केवल एक फर्क होगा जब का मूल्य @Regionहै null, यानी जब अपना पहला प्रश्न अनिवार्य रूप से एक दूसरे के हो जाता है।

उस स्थिति में, ANSI_NULLS ON कोई पंक्तियाँ नहीं लौटाएगा (क्योंकि null = nullअज्ञात बूलियन मान (aka null) प्राप्त करेगा) और ANSI_NULLS OFF उन पंक्तियों को लौटा देगा जहाँ क्षेत्र फ़ील्ड शून्य है (क्योंकि null = nullउपज होगी true)


6

अगर ANSI_NULLS "ON" पर सेट है और यदि हम =, <> NULL कॉलम वैल्यू पर सिलेक्ट स्टेटमेंट लिखते समय लागू करते हैं तो यह कोई परिणाम नहीं देगा।

उदाहरण

create table #tempTable (sn int, ename varchar(50))

insert into #tempTable
values (1, 'Manoj'), (2, 'Pankaj'), (3, NULL), (4, 'Lokesh'), (5, 'Gopal')

ANSI_NULLS चालू सेट करें

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)

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)

2
केवल जवाब होने के लिए +1 कि स्पष्ट रूप से अलग बीच WHERE X IS NULLऔर WHERE X = NULL, और कैसे ANSI_NULLS परिणाम को प्रभावित करता है। अति उत्साही मतदाताओं के प्रयासों के बावजूद, यह स्वीकार किया जाना चाहिए!
Riegardt Steyn

1
उदाहरणों का उपयोग करके समझाने के लिए +1, जो हमेशा लंबे वाक्यों के बजाय स्पष्ट और अधिक संक्षिप्त होगा।
पीटररियोन्टो

3

ANSI_NULLS चालू सेट करें

आईटी तालिका में शून्य मान सहित सभी मान लौटाता है

ANSI_NULLS बंद करें

यह समाप्त होता है जब कॉलम में शून्य मान होते हैं


2
पहले से बताए गए उत्तरों में यह उत्तर कितना अतिरिक्त है? पुराने प्रश्नों के नए उत्तरों को जोड़ने से सावधान रहें - उनमें पहले से ही पोस्ट किए गए समाधानों पर विस्तारित
स्पष्टीकरण

1

मुझे लगता है कि यहाँ मुख्य बात यह है:

उपयोगकर्ता कभी नहीं :

  • @anything = NULL
  • @anything <> NULL
  • @anything != null

हमेशा उपयोग करें:

  • @anything IS NULL
  • @anything IS NOT NULL

0

ANSI NULLS OFF सेट करें NULL = NULL तुलनात्मक रिटर्न को सही बनाएगा। ईजी:

        SET ANSI_NULLS OFF
        select * from sys.tables
        where principal_id = Null

नीचे दिखाए अनुसार कुछ परिणाम देंगे: zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPमेल 2840564 NULL ZWWOrgLevelClientFee 4322525 NULL

हालांकि यह क्वेरी कोई परिणाम नहीं लौटाएगी:

        SET ANSI_NULLS ON 
        select * from sys.tables
        where principal_id = Null

0

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql

जब SET ANSI_NULLS चालू होता है, तो एक सेलेक्ट स्टेटमेंट जिसमें WHERE column_name = NULL का उपयोग किया जाता है, भले ही column_name में शून्य मान हों, फिर भी शून्य पंक्तियों को वापस करता है। एक सेलेक्ट स्टेटमेंट जिसमें WHERE column_name <> का उपयोग किया जाता है, भले ही column_name में नॉननल मान हो, फिर भी शून्य पंक्तियाँ वापस आती हैं।

उदाहरण के लिए

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 !
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.