এসকিউএল কোয়েরি থেকে ভেরিয়েবল কীভাবে সেট করবেন?


323

আমি একটি এসকিউএল কোয়েরি থেকে একটি ভেরিয়েবল সেট করার চেষ্টা করছি:

declare @ModelID uniqueidentifer

Select @ModelID = select modelid from models
where areaid = 'South Coast'

স্পষ্টতই আমি এটি সঠিকভাবে করছি না কারণ এটি কাজ করে না। কেউ কি সমাধানের পরামর্শ দিতে পারেন?

ধন্যবাদ!



2
এটা অনন্য পরিচয়। অনন্য পরিচয় নয়।
DxTx

উত্তর:


517

নির্বাচন করুন:

SELECT @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'

সেট ব্যবহার:

SET @ModelID = (SELECT m.modelid 
                  FROM MODELS m
                 WHERE m.areaid = 'South Coast')

এই প্রশ্নটি টিএসকিউএলে SELECT এবং SET ব্যবহারের মধ্যে পার্থক্যের জন্য দেখুন

সতর্কতা

যদি এই নির্বাচিত বিবৃতিটি একাধিক মান প্রদান করে (শুরু করা খারাপ):

  • ব্যবহার করার সময় SELECT, ভেরিয়েবলটি কোনও ত্রুটি বা সতর্কতা ছাড়াই, ফেরত দেওয়া শেষ মানটি (যেমন Womp হিসাবে বলা হয়) বরাদ্দ করা হয় (এটি লজিক বাগের কারণ হতে পারে)
  • ব্যবহার করার সময় SET, একটি ত্রুটি ঘটবে

3
যদি এই নির্বাচিত বিবৃতিটি একাধিক মান ফেরত দেয়: প্রথম ক্ষেত্রে, ভেরিয়েবলটি কোনও ত্রুটি বা সতর্কতা ছাড়াই (ফেরত দেওয়া হিসাবে) ফেরত দেওয়া শেষ মান নির্ধারিত হয় (এটি যুক্তি ত্রুটির কারণ হতে পারে); দ্বিতীয় ক্ষেত্রে, একটি ত্রুটি ঘটবে।
ফ্রান্সিস নিউ

3
বিটিডাব্লু, এসইটি ব্যবহার করে কেসটি এক জোড়া বন্ধনী প্রয়োজন: SET @ মডেলিড = (নির্বাচন করুন ...)
ফ্রান্সিস নিউ

2
আমি নির্বাচিত সাথে শীর্ষস্থানীয় 1 ব্যবহার করব, কেবলমাত্র 1 টি ফলাফল, যেমন SET @ মডেলিড = সেট করুন (মডেল থেকে শীর্ষ 1 মি। মডেল যেখানে m.areaid = 'দক্ষিণ উপকূল')
টিপাকটোপা

যদি একাধিক মান ফিরে আসে সেট ব্যবহারের ক্ষেত্রে ব্যতিক্রম হ্যান্ডলিং ব্যবহার করে এটি কীভাবে পরিচালনা করবেন?
শিক্ষার্থী

চুপচাপ কোনও অপ্রত্যাশিত ফলাফল ব্যবহার করার পরিবর্তে কোনও অপ্রত্যাশিত সদৃশ ফলাফল থাকলে কখনও কখনও আপনি ত্রুটি চান want
ডেনিস স্কিডমোর

37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

যদি আপনার নির্বাচিত বিবৃতিটি একাধিক মান ফেরত দেয় তবে আপনার ভেরিয়েবলটি সর্বশেষ মানটি প্রদান করে যা প্রত্যাবর্তিত হয়।

ভেরিয়েবলগুলির সাথে নির্বাচন করুন সম্পর্কিত রেফারেন্সের জন্য: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx


28
declare @ModelID uniqueidentifer

--make sure to use brackets
set @ModelID = (select modelid from models
where areaid = 'South Coast')

select @ModelID

এই প্রশ্নের সমস্ত প্রস্তুত একটি উত্তর আছে যার আবার উত্তর দেওয়ার দরকার নেই, আমি এমনকি আপনার এবং পনিজের উত্তরটির মধ্যে কী আলাদা তা দেখতে পাচ্ছি না?
জোশুয়া ডক্সবাড়ি

5
@ জোশুয়াডক্সবারি এটি একটি ওয়ার্কিং কপি পেস্ট সংস্করণ সরবরাহ করে
গ্রেগ 121


10

TOP 1যদি কোয়েরিতে একাধিক সারি ফিরে আসে তবে ব্যবহার করুন ।

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'

এটি আসলে এসকিউএলে কোনও ত্রুটি সৃষ্টি করবে না এটি সর্বশেষ রেকর্ডটি নির্বাচন করবে (যদিও আপনি যদি এই মানটি ব্যবহার করে থাকেন এবং এটি ভুল হয় তবে এটি কোনও অ্যাপ্লিকেশনটির ফলে ত্রুটি সৃষ্টি করতে পারে)
d219

9

আপনি এটি ব্যবহার করতে পারেন তবে মনে রাখবেন যে আপনার প্রশ্নের 1 টি ফলাফল দেয়, একাধিক ফলাফল ব্যতিক্রম ছুঁড়ে দেবে।

declare @ModelID uniqueidentifer
Set @ModelID = (select Top(1) modelid from models where areaid = 'South Coast')

অন্য উপায়:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'

4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

এই ক্ষেত্রে যদি আপনার দুটি বা ততোধিক ফলাফল ফিরে আসে তবে আপনার ফলাফলটি সর্বশেষ রেকর্ড। সুতরাং আপনার যদি আরও দুটি রেকর্ড ফেরত আসতে পারে তবে আপনি সম্ভবত প্রত্যাশিত ফলাফলটি দেখতে না পেয়ে এটি সম্পর্কে সচেতন হন।


4

তিনটি পন্থা রয়েছে:

  1. ঘোষণা করা
  2. সেট - মাইক্রোসফ্ট প্রস্তাবিত পদ্ধতির
  3. নির্বাচন

কোয়েরির নীচে প্রতিটিটির সুবিধা এবং অসুবিধার বিবরণ দেওয়া হয়েছে:

-- First way, 
DECLARE @test int = (SELECT 1)
       , @test2 int = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- advantage: declare and set in the same place
-- Disadvantage: can be used only during declaration. cannot be used later

-- Second way
DECLARE @test int  
       , @test2 int 

SET @test = (select 1)
SET @test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: ANSI standard. 
-- Disadvantage: cannot set more than one variable at a time

-- Third way
DECLARE @test int, @test2 int 
SELECT @test = (select 1)
      ,@test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: Can set more than one variable at a time
-- Disadvantage: Not ANSI standard

1

এসএসকিউএল ব্যবহার করে এসএসআইজিএন ভেরিয়েবলের জন্য নিচের মত দেখানো ভাল অনুশীলন নির্বাচন করুন

->DECLARE co_id INT ;
->DECLARE sname VARCHAR(10) ;

->SELECT course_id INTO co_id FROM course_details ;
->SELECT student_name INTO sname FROM course_details;

যদি আপনাকে একটি লাইনে একাধিক ভেরিয়েবল বরাদ্দ করতে হয় তবে আপনি এই একই নির্বাচন INTO ব্যবহার করতে পারেন

->DECLARE val1 int;
->DECLARE val2 int;

->SELECT student__id,student_name INTO val1,val2 FROM student_details;

--HAPPY CODING-- 

"সেরা অনুশীলন" - উত্স?
রডনি এলিস

যদি আপনার কোনও সারণি থেকে একাধিক কলাম নির্বাচন করতে হয় তবে আপনি কোডটি পুনরাবৃত্তি না করে সহজেই একটি সিলেক্ট ইনটো স্টেটমেন্ট ব্যবহার করে এটি নির্ধারণ করতে পারবেন !!
ভেঙ্কজ_ভেনকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.