উত্তর:
উদ্ধৃতি , যা এই নিবন্ধ থেকে সংক্ষিপ্তসার :
- ভেরিয়েবল অ্যাসাইনমেন্টের জন্য এসইটি হ'ল এএনএসআই স্ট্যান্ডার্ড, নির্বাচন নয়।
- SET একবারে কেবল একটি ভেরিয়েবল বরাদ্দ করতে পারে, SELECT একবারে একাধিক অ্যাসাইনমেন্ট দিতে পারে।
- যদি কোনও কোয়েরি থেকে বরাদ্দ করা হয় তবে এসইটি কেবল একটি স্কেলারের মান নির্ধারণ করতে পারে। যদি কোয়েরিতে একাধিক মান / সারি ফিরে আসে তবে SET ত্রুটি বাড়িয়ে তুলবে। নির্বাচনটি ভেরিয়েবলের মধ্যে একটি মান নির্ধারণ করে এবং একাধিক মান ফিরে আসার বিষয়টি লুকিয়ে রাখে (সুতরাং আপনি সম্ভবত কখনই বুঝতে পারবেন না যে কেন অন্য কোথাও ভুল হচ্ছে - মজাদার সমস্যা সমাধানে মজা করুন)
- যখন কোনও কোয়েরি থেকে নির্ধারণের সময় যদি কোনও মান ফেরত না থাকে তবে SET NULL প্রদান করবে, যেখানে SELECT মোটেও কার্যনির্বাহীকরণ করবে না (সুতরাং ভেরিয়েবলটি তার আগের মান থেকে পরিবর্তন করা হবে না)
- যতদূর গতির পার্থক্য - SET এবং SELECT এর মধ্যে সরাসরি কোনও পার্থক্য নেই। তবে একটি শটে একাধিক অ্যাসাইনমেন্ট করার জন্য SELECT এর ক্ষমতা সেটকে এটির চেয়ে সামান্য গতির সুবিধা দেয়।
SELECT @Int = @Int + 1, @Int = @Int + 1
হলে @Int
এটি 2 হিসাবে শেষ হয় success ধারাবাহিক স্ট্রিং-ম্যানিপুলেশনগুলি করার সময় এটি খুব কার্যকর হতে পারে।
আমি বিশ্বাস করি SET
এএনএসআই মানক যদিও এটি SELECT
নেই। এছাড়াও বিভিন্ন আচরণ করে মনে রাখবেন SET
বনাম SELECT
নিচে যখন একটি মান পাওয়া যায় না উদাহরণে।
declare @var varchar(20)
set @var = 'Joe'
set @var = (select name from master.sys.tables where name = 'qwerty')
select @var /* @var is now NULL */
set @var = 'Joe'
select @var = name from master.sys.tables where name = 'qwerty'
select @var /* @var is still equal to 'Joe' */
select @var = (select name from master.sys.tables where name = 'qwerty')
আপনি @var নਾਲ হিসাবে পাবেন get আপনি যে উদাহরণটি দিচ্ছেন সেটি একই ক্যোয়ারী নয়।
(select name from master.sys.tables where name = 'qwerty')
একটির name from master.sys.tables where name = 'qwerty'
জন্য এবং অন্যটির জন্য ... আপনি কি তা দেখছেন না?
(select name from master.sys.tables where name = 'qwerty')
একটি স্কেলার সাবকিউরি এবং name from master.sys.tables where name = 'qwerty'
একটি সাধারণ ক্যোয়ারী। দুটি পৃথক এক্সপ্রেশন একই ফলাফল দেওয়ার কথা নয়, যদিও মনে হয় আপনি তাদের বোঝাচ্ছেন যে তাদের উচিত। যদি আপনি SET
এবং SELECT
কীওয়ার্ডগুলির পৃথক বাস্তবায়ন রয়েছে তা বলার চেষ্টা করছেন , আপনার উদাহরণগুলিতে দুটি পৃথক এক্সপ্রেশন ব্যবহার করা উচিত নয় । msdn.microsoft.com/en-us/library/ms187330.aspx
প্রশ্নগুলি লেখার সময়, এই পার্থক্যটি মনে রাখা উচিত:
DECLARE @A INT = 2
SELECT @A = TBL.A
FROM ( SELECT 1 A ) TBL
WHERE 1 = 2
SELECT @A
/* @A is 2*/
---------------------------------------------------------------
DECLARE @A INT = 2
SET @A = (
SELECT TBL.A
FROM ( SELECT 1 A) TBL
WHERE 1 = 2
)
SELECT @A
/* @A is null*/
একজন এএনএসআই এবং গতি ইত্যাদি বাদে, একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে যা সর্বদা আমার কাছে গুরুত্বপূর্ণ; এএনএসআই এবং গতির চেয়ে বেশি। এই গুরুত্বপূর্ণ দৃষ্টিভঙ্গির কারণে আমি যে বাগের সংখ্যা স্থির করেছি সেগুলি বড়। কোড রিভিউগুলির সময় আমি এটি সন্ধান করি।
-- Arrange
create table Employee (EmployeeId int);
insert into dbo.Employee values (1);
insert into dbo.Employee values (2);
insert into dbo.Employee values (3);
-- Act
declare @employeeId int;
select @employeeId = e.EmployeeId from dbo.Employee e;
-- Assert
-- This will print 3, the last EmployeeId from the query (an arbitrary value)
-- Almost always, this is not what the developer was intending.
print @employeeId;
প্রায় সবসময়ই, বিকাশকারী এটির উদ্দেশ্যে নয়। উপরের দিকে, ক্যোয়ারীটি সোজা এগিয়ে রয়েছে তবে আমি এমন প্রশ্নগুলি দেখেছি যেগুলি বেশ জটিল এবং এটি নির্ধারণ করে যে এটি একটি একক মান ফেরত দেবে কিনা তা তুচ্ছ নয়। ক্যোয়ারী প্রায়শই এর চেয়ে জটিল এবং সম্ভাবনা অনুসারে এটি একক মান ফেরত চলেছে। বিকাশকারী পরীক্ষার সময় সমস্ত ঠিক আছে। তবে এটি টিকটিক বোমার মতো এবং যখন ক্যোয়ারী একাধিক ফলাফল প্রত্যাবর্তন করবে তখন সমস্যা সৃষ্টি করবে। কেন? কারণ এটি কেবল চলকটির সর্বশেষ মান নির্ধারণ করবে।
এখন এর সাথে একই জিনিসটি চেষ্টা করা যাক SET
:
-- Act
set @employeeId = (select e.EmployeeId from dbo.Employee e);
আপনি একটি ত্রুটি পাবেন:
সাবকিউরি 1 টির বেশি মান ফেরত দিয়েছে। যখন subquery =,! =, <, <=,>,> = অনুসরণ করে বা যখন subquery একটি এক্সপ্রেশন হিসাবে ব্যবহৃত হয় তখন এটি অনুমোদিত হয় না।
এটি আশ্চর্যজনক এবং খুব গুরুত্বপূর্ণ কারণ আপনি কেন কিছু তুচ্ছ "ফলাফলের ফলাফল হিসাবে শেষ আইটেম" অর্পণ করতে চান @employeeId
। সঙ্গে select
যদি আপনি কোন ভুল পান করবে না এবং আপনি মিনিটের ব্যয় হবে, ঘন্টা ডিবাগ।
সম্ভবত, আপনি একটি একক আইডির সন্ধান করছেন এবং SET
আপনাকে আপনার প্রশ্নের সমাধানের জন্য বাধ্য করবে। সুতরাং আপনি যেমন কিছু করতে পারেন:
-- Act
-- Notice the where clause
set @employeeId = (select e.EmployeeId from dbo.Employee e where e.EmployeeId = 1);
print @employeeId;
পরিষ্কার কর
drop table Employee;
উপসংহারে, ব্যবহার করুন:
SET
: আপনি যখন কোনও ভেরিয়েবলের জন্য একটি একক মান নির্ধারণ করতে চান এবং আপনার ভেরিয়েবলটি একটি মানের জন্য।SELECT
: আপনি যখন একটি ভেরিয়েবল একাধিক মান নির্ধারণ করতে চান। ভেরিয়েবলটি কোনও টেবিল, টেম্প টেবিল বা টেবিলের পরিবর্তনশীল ইত্যাদি হতে পারে