এসকিউএল সার্ভারে, "সেট এএনএসআই_নুলস চালু" এর অর্থ কী?


92

সংজ্ঞা বলে:

যখন SES ANSI_NULLS চালু থাকে, WHOLE কলাম_নাম = NULL ব্যবহার করে এমন একটি নির্বাচনী বিবৃতি কলাম_নামে নাল মান থাকা সত্ত্বেও শূন্য সারি প্রদান করে। একটি নির্বাচনী বিবৃতি যা WHERE কলাম_নাম <> NULL ব্যবহার করে কলাম_নামে নাল নালাগুলি থাকলেও শূন্য সারি প্রদান করে।

এর অর্থ কি এই কোয়েরিতে কোনও নাল অন্তর্ভুক্ত করা হবে না?

SELECT Region
FROM employees
WHERE Region = @region

বা ANSI_NULLউদ্বিগ্নতা কি কেবল এই জাতীয় প্রশ্নগুলি WHEREরয়েছে (যেখানে নির্দিষ্ট শব্দটি অন্তর্ভুক্ত রয়েছে NULL)?

SELECT Region
FROM employees
WHERE Region = NULL

4
সরকারী নথিপত্রের যে চতুর্থ অনুচ্ছেদে উত্তরটি ইতিমধ্যে সেখানে নেই, যা থেকে আপনি 1 ম অনুচ্ছেদটি অনুলিপি করেছেন: -> "সেট এএনএসআই_নুলস চালু করুন কেবল তখনই যদি তুলনার অপারেটরগুলির মধ্যে একটি হয় ভেরিয়েবল যা নুল হয় বা একটি আক্ষরিক NULL। তুলনার উভয় পক্ষ কলাম বা যৌগিক এক্সপ্রেশন হয়, সেটিংস তুলনা প্রভাবিত করে না। "
user1451111

উত্তর:


68

এর মানে কোনো সারি যদি ফেরত পাঠানো হবে @regionহয় NULLযখন আপনার প্রথম উদাহরণে ব্যবহৃত এমনকি যদি সেখানে টেবিল যেখানে সারি হয়, Regionহয় NULL

কখন ANSI_NULLSচালু থাকে (যা আপনার সর্বদা যাইহোক সেট করা উচিত, যেহেতু এটি চালু না করার বিকল্পটি ভবিষ্যতে অপসারণ করা হবে), কোনও তুলনামূলক ক্রিয়াকলাপ যেখানে (কমপক্ষে) কোনও অপারেশন NULLতৃতীয় যুক্তিযুক্ত মান তৈরি করে - UNKNOWN( হিসাবে বিরোধী TRUEএবং FALSE)।

UNKNOWNমান যদি তারা ইতিমধ্যে সিদ্ধান্ত নিয়েছে করছি না (যেমন কোন মিশ্রন বুলিয়ান অপারেটরদের মাধ্যমে বংশ বিস্তার ANDএকটি সঙ্গে FALSEপ্রতীক বা ORসঙ্গে একটি TRUEপ্রতীক) অথবা negations ( NOT)।

WHEREদফা ফিল্টার করতে ফলাফল সেট দ্বারা উত্পাদিত ব্যবহার করা হয় FROMদফা, যেমন যে সামগ্রিক মান WHEREদফা হওয়া আবশ্যক TRUEসারি জন্য ফিল্টার করা নয় হবে। সুতরাং, যদি UNKNOWNকোনও তুলনা করে একটি উত্পাদিত হয়, এটি সারিটি ফিল্টার আউট করে দেবে।


@ ব্যবহারকারী 1227804 এর উত্তরে এই উদ্ধৃতিটি অন্তর্ভুক্ত রয়েছে:

যদি তুলনার উভয় পক্ষ কলাম বা যৌগিক এক্সপ্রেশন হয় তবে সেটিংটি তুলনাটিকে প্রভাবিত করে না।

* থেকে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সেটিংসটি কোনও প্রভাব ফেলেনি তবে এটি আরও পরিষ্কার হত ।


4
সুতরাং যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি: তবে এটি "কোথায় অঞ্চল = @ অঞ্চল" বাক্যাংশের ফলাফলকে প্রভাবিত করে কেবল তখনই যখন আমি বিশেষত "কোথায় অঞ্চল = নাল" লিখি না?
রোডনিকো

7

যদি মান @Regionনা nullহয় (বলুন @Region = 'South') এটিএনসআই_এনএলএলএসের মান নির্বিশেষে অঞ্চল ক্ষেত্রটি শূন্য যেখানে সারিগুলি ফিরবে না।

ANSI_NULLS শুধুমাত্র একটি পার্থক্য করতে হবে যখন এর মান @Regionহয় null, অর্থাত্ যখন আপনার প্রথম প্রশ্নের সাথে মূলত দ্বিতীয় হয়ে।

সেক্ষেত্রে, এএনএসআই_নুলস কোনও সারি ফেরত দেবে না (কারণ null = nullএকটি অজানা বুলিয়ান মান দেবে (ওরফেnull ) দেবে) এবং এএনএসআই_এনএলএলএস অফ যেখানে যে ক্ষেত্রটি শূন্য রয়েছে এমন কোনও সারি ফেরত null = nullদেবে (কারণ ফল হবে true)


6

যদি এএনএসআই_এনএলএলস "চালু" তে সেট করা থাকে এবং যদি আমরা সিলেক্ট স্টেটমেন্ট লেখার সময় NULL কলামের মানটিতে =, <> প্রয়োগ করি তবে এটি কোনও ফল দেয় না।

উদাহরণ

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

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

এএনএসআই_নুলস চালু করুন

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)

4
কেবলমাত্র উত্তর হওয়ার জন্য +1 যা স্পষ্টভাবে আলাদা করে WHERE X IS NULLএবং এর মধ্যে WHERE X = NULLএবং কীভাবে ANSI_NULLS ফলাফলকে প্রভাবিত করে। ভোটারদের অত্যধিক উদ্যোগী হওয়া সত্ত্বেও, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
রিগার্ড্ট স্টেইন

4
উদাহরণ ব্যবহার করে ব্যাখ্যা করার জন্য +1, যা দীর্ঘতর বাক্যগুলির চেয়ে সর্বদা পরিষ্কার এবং আরও সংক্ষিপ্ত হবে।
পিটার.আরিয়ান্টো

3

এএনএসআই_নুলস চালু করুন

আইটি টেবিলের নাল মান সহ সমস্ত মান প্রদান করে

এএনএসআই_নুলস বন্ধ করুন

এটি শেষ হয় যখন কলামগুলিতে নাল মান থাকে


4
ইতিমধ্যে বর্ণিত উত্তরে এই উত্তরটি কী অতিরিক্ত যুক্ত করে? পুরানো প্রশ্নের নতুন উত্তর যুক্ত সম্পর্কে সতর্ক থাকুন - তাদের ইতিমধ্যে পোস্ট করা সমাধানগুলির উপর বিস্তৃত ব্যাখ্যা থাকতে হবে, বা নতুন অন্তর্দৃষ্টি দেওয়া উচিত - পর্যালোচনা থেকে
টাকারি

1

আমার ধারণা এখানে মূল জিনিসটি হ'ল:

কখনও ব্যবহারকারী:

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

সর্বদা ব্যবহার করুন:

  • @anything IS NULL
  • @anything IS NOT NULL

0

এএনএসআই নালস অফ সেট সেট করুন NULL = NULL তুলনা ফিরে আসল করে তোলে। ইজি:

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

নীচে প্রদর্শিত হিসাবে কিছু ফলাফল ফিরে আসবে: zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPerifications 2840564 NULL ZCWOrgLevelClientFee 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

যখন SES ANSI_NULLS চালু থাকে, WHETE কলাম_নাম = NULL ব্যবহার করে এমন একটি নির্বাচনী বিবৃতি কলাম_নামে নাল মান থাকা সত্ত্বেও শূন্য সারি প্রদান করে। এমন একটি নির্বাচনী বিবৃতি যা WHERE কলাম_নাম <> NULL ব্যবহার করে কলাম_নেমে ননাল মান রয়েছে এমন কি শূন্য সারি প্রদান করে।

যেমন যেমন

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 !
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.