SQL सर्वर में, ANSI_NULLS सेटिंग आपको यह निर्दिष्ट करने की अनुमति देती है कि कैसे NULL प्रश्नों में मूल्यों का इलाज किया जाता है।
अधिक विशेष रूप से, यह आपको बराबर के आईएसओ अनुरूप व्यवहार को निर्दिष्ट करने की अनुमति देता है (= ) और इसके बराबर नहीं (<> ) तुलना ऑपरेटर जब उनका उपयोग NULL . के साथ किया जाता है मान।
ANSI_NULLS ON पर सेट किया जा सकता है या OFF . एक NULL परीक्षण जो ANSI_NULLS OFF . के साथ सत्य लौटाता है ANSI_NULLS ON with के साथ वास्तव में झूठी वापसी कर सकता है ।
यह बहुत भ्रम का स्रोत हो सकता है, और इसलिए यह समझने के लिए भुगतान करता है कि कैसे ANSI_NULLS काम करता है।
ANSI_NULLS सेटिंग्स को डेटाबेस स्तर और सत्र स्तर पर सेट किया जा सकता है। यदि कोई ANSI_NULLS सत्र स्तर पर सेटिंग निर्दिष्ट नहीं है, SQL सर्वर जो भी ANSI_NULLS का उपयोग करेगा सेटिंग वर्तमान डेटाबेस पर लागू होती है। इसलिए, तदर्थ प्रश्न लिखते समय आप अपनी स्वयं की सत्र स्तर सेटिंग के साथ डेटाबेस सेटिंग को ओवरराइड कर सकते हैं।
ध्यान देने योग्य एक महत्वपूर्ण बात यह है कि SQL सर्वर नेटिव क्लाइंट ODBC ड्राइवर और SQL सर्वर के लिए SQL सर्वर नेटिव क्लाइंट OLE DB प्रदाता स्वचालित रूप से ANSI_NULLS सेट करता है। करने के लिए ON कनेक्ट करते समय। इस सेटिंग को ODBC डेटा स्रोतों में, ODBC कनेक्शन विशेषताओं में, या OLE DB कनेक्शन गुणों में कॉन्फ़िगर किया जा सकता है जो SQL सर्वर की आवृत्ति से कनेक्ट होने से पहले एप्लिकेशन में सेट हैं।
अपने सत्र की ANSI_NULLS सेटिंग की जांच कैसे करें
आप SESSIONPROPERTY() . का उपयोग कर सकते हैं ANSI_NULLS . की जांच करने के लिए कार्य करें वर्तमान सत्र के लिए सेटिंग।
SELECT SESSIONPROPERTY('ANSI_NULLS'); परिणाम:
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
इस मामले में, ANSI_NULLS मेरे सत्र के लिए सेटिंग ON है .
एक शून्य (0 ) का मतलब होगा कि यह बंद है।
अपने सत्र की ANSI_NULLS सेटिंग कैसे बदलें
आप अपने सत्र की ANSI_NULLS सेटिंग को OFF . पर सेट कर सकते हैं निम्नलिखित कोड के साथ:
SET ANSI_NULLS OFF; फिर इसे फिर से जाँचने पर एक शून्य उत्पन्न होगा।
SELECT SESSIONPROPERTY('ANSI_NULLS'); परिणाम:
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
SET ANSI_NULLS . के लिए डिफ़ॉल्ट मान OFF है . हालाँकि, जैसा कि ऊपर बताया गया है, SQL सर्वर नेटिव क्लाइंट ODBC ड्राइवर और SQL सर्वर के लिए SQL सर्वर नेटिव क्लाइंट OLE DB प्रदाता स्वचालित रूप से ANSI_NULLS सेट करता है। करने के लिए ON कनेक्ट करते समय।
कैसे के उदाहरण ANSI_NULLS क्वेरी को प्रभावित करता है
ANSI_NULLS के मान के आधार पर आपको मिलने वाले विभिन्न परिणामों को प्रदर्शित करने के लिए यहां कुछ बुनियादी उदाहरण दिए गए हैं सेटिंग।
ये SET ANSI_NULLS . का उपयोग करते हैं ANSI_NULLS को टॉगल करने के लिए वर्तमान सत्र के लिए सेटिंग।
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL; परिणाम:
(0 rows affected)
जब ANSI_NULLS ON है , एक NULL . के विरुद्ध सभी तुलनाएं मान UNKNOWN का मूल्यांकन करें .
इस मामले में, हम यह नहीं कह सकते कि NULL बराबर NULL क्योंकि प्रत्येक मान अज्ञात है।
इसलिए, उपरोक्त क्वेरी के लिए कोई पंक्तियाँ नहीं लौटाई गई हैं।
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL; परिणाम:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
जब ANSI_NULLS OFF है , सभी डेटा की तुलना NULL . से करना मान TRUE . का मूल्यांकन करें यदि डेटा मान NULL है ।
नॉट इक्वल टू ऑपरेटर का उपयोग करते समय भी यही तर्क लागू होता है (<> )।
आइए नॉट इक्वल टू ऑपरेटर को शामिल करने के लिए उदाहरण का विस्तार करें (<> ), साथ ही NULL . के बीच तुलना और एक गैर-NULL मूल्य।
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL; परिणाम:
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
जैसा कि अपेक्षित था, किसी भी प्रश्न के लिए कोई पंक्तियाँ नहीं लौटाई गई हैं। ऐसा इसलिए है क्योंकि NULL मानों को UNKNOWN के रूप में माना जाता है मान जब ANSI_NULLS ON है .
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL; परिणाम:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS . पर हमें एक अलग परिणाम मिलता है OFF है .
इस मामले में, SQL सर्वर NULL का इलाज नहीं करता है UNKNOWN . के रूप में . यह निर्धारित करता है कि NULL वास्तव में NULL . के बराबर है ।
यह एएनएसआई मानक के अनुरूप नहीं है।
द IS NULL विधेय
ANSI_NULLS . पर ध्यान दिए बिना किसी स्क्रिप्ट के इरादे के अनुसार काम करने के लिए डेटाबेस विकल्प या SET ANSI_NULLS . की सेटिंग , IS NULL . का उपयोग करें और IS NOT NULL उन तुलनाओं में जिनमें शून्य मान हो सकते हैं
यहाँ क्या होता है जब हम IS NULL . का उपयोग करने के लिए पिछले उदाहरण को फिर से लिखते हैं और IS NOT NULL ।
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL; परिणाम:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL; परिणाम:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
जैसा अपेक्षित था, हमें ANSI_NULLS . की परवाह किए बिना वही परिणाम मिलता है सेटिंग।
तुलना तालिका
निम्न तालिका बूलियन व्यंजक और ANSI_NULLS के आधार पर आपके द्वारा प्राप्त की जा सकने वाली विविधताओं को रेखांकित करती है सेटिंग।
| बूलियन एक्सप्रेशन | ANSI_NULLS चालू करें | ANSI_NULLS बंद सेट करें |
|---|---|---|
| NULL =NULL | अज्ञात | सच |
| 1 =NULL | अज्ञात | गलत |
| नल <> NULL | अज्ञात | गलत |
| 1 <> NULL | अज्ञात | सच |
| नल> NULL | अज्ञात | अज्ञात |
| 1> NULL | अज्ञात | अज्ञात |
| शून्य शून्य है | सच | सच |
| 1 IS NULL | गलत | गलत |
| नल न्यूल नहीं है | गलत | गलत |
| 1 खाली नहीं है | सच | सच |
डेटाबेस स्तर पर ANSI_NULLS सेट करना
प्रत्येक SQL सर्वर डेटाबेस में एक ANSI_NULLS होता है सेटिंग, जो निर्धारित करती है कि NULL . से तुलना कैसे की जाती है मूल्यों का मूल्यांकन किया जाता है।
- जब
ONपर सेट किया जाता है , एकNULL. से तुलना मानUNKNOWNका मूल्यांकन करें । - जब
OFFपर सेट किया जाता है , गैर-यूनिकोड मानों की तुलनाNULL. से करना मानTRUE. का मूल्यांकन करें यदि दोनों मानNULLहैं ।
आप निम्न कोड वाले डेटाबेस पर इस सेटिंग को बदल सकते हैं:
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
यह ANSI_NULLS sets सेट करता है करने के लिए ON वर्तमान डेटाबेस के लिए। आप CURRENT स्वैप कर सकते हैं यदि पसंद हो तो डेटाबेस के नाम के साथ।
आप DATABASEPROPERTYEX() . के साथ वर्तमान सेटिंग की जांच कर सकते हैं समारोह।
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled'); परिणाम:
1
जैसा कि उल्लेख किया गया है, आप इस सेटिंग को सत्र स्तर पर सेट करके तदर्थ प्रश्न लिखते समय ओवरराइड कर सकते हैं जैसे हमने पहले किया था।
जब हम इस विषय पर होते हैं, तो मुझे यह उल्लेख करना चाहिए कि SQL सर्वर डेटाबेस में एक ANSI_NULL_DEFAULT भी होता है। सेटिंग। यह सेटिंग डिफ़ॉल्ट मान निर्धारित करती है, NULL या NOT NULL , एक स्तंभ या CLR उपयोगकर्ता-परिभाषित प्रकार का, जिसके लिए CREATE TABLE में स्पष्ट रूप से शून्यता को परिभाषित नहीं किया गया है या ALTER TABLE बयान।
यह मान इस तरह सेट किया जा सकता है:
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON; इसका मान इस प्रकार प्राप्त किया जा सकता है:
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault'); परिणाम:
1
आप sys.databases . का भी उपयोग कर सकते हैं सभी डेटाबेस के लिए इन सेटिंग्स को वापस करने के लिए कैटलॉग व्यू।
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;