SQL क्वेरी से वेरिएबल कैसे सेट करें?


323

मैं SQL क्वेरी से एक चर सेट करने की कोशिश कर रहा हूँ:

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')

TSQL में SELECT और SET का उपयोग करने के बीच अंतर के लिए यह प्रश्न देखें

चेतावनी

यदि यह चयन स्टेटमेंट कई मान लौटाता है (शुरुआत के साथ खराब):

  • उपयोग करते समय SELECT, चर को अंतिम मान दिया जाता है जिसे वापस लौटा दिया जाता है (जैसा कि अपव्यय कहा जाता है), बिना किसी त्रुटि या चेतावनी के (यह तर्क कीड़े पैदा कर सकता है)
  • उपयोग करते समय SET, एक त्रुटि उत्पन्न होगी

3
यदि यह चयन विवरण कई मान लौटाता है: पहले मामले में, चर को अंतिम मान दिया जाता है जिसे वापस लौटा दिया जाता है (जैसा कि अपव्यय कहा जाता है), बिना किसी त्रुटि या चेतावनी के (यह तर्क बग पैदा कर सकता है); दूसरे मामले में, एक त्रुटि उत्पन्न होगी।
फ्रांसिस नीयू

3
BTW, SET का उपयोग करने वाले मामले को कोष्ठक की एक जोड़ी की जरूरत है: SET @ModelID = (SELECT ...)
फ्रांसिस

2
मैं केवल 1 परिणाम के साथ TOP 1 का उपयोग करूंगा, उदाहरण के लिए SET @ModelID = (Select TOP 1 m.modelid FROM MODELS m WHERE m.areaid = 'South Coast')
TPAKTOPP

सेट के उपयोग के मामले में जब कई मान लौटाए जाते हैं तो अपवाद हैंडलिंग का उपयोग करके इसे कैसे संभालना है?
शिक्षार्थी

कभी-कभी आप एक त्रुटि चाहते हैं यदि अप्रत्याशित परिणाम का उपयोग करके चुपचाप के बजाय एक अप्रत्याशित डुप्लिकेट परिणाम होता है।
डेनिस स्किडमोर

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

यदि आपका चयन विवरण कई मान लौटाता है, तो आपके चर को अंतिम मान दिया जाता है जो वापस आ जाता है।

चरों के साथ चयन का उपयोग करने के संदर्भ में: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx


29
declare @ModelID uniqueidentifer

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

select @ModelID

इस सवाल का सभी तैयार एक जवाब है इसे फिर से जवाब देने की ज़रूरत नहीं है, मैं यह भी नहीं देख सकता कि आपके और पॉनीज़ के बीच क्या अंतर है?
जोशुआ डक्सबरी

5
@ जोशड्यूक्सबरी यह एक काम करने वाला कॉपी पेस्ट संस्करण उपलब्ध कराता है
greg121

17

मैं इसे केवल घोषित वक्तव्य से निर्धारित करना पसंद करता हूं

DECLARE @ModelID uniqueidentifer = (SELECT modelid 
                                    FROM models
                                    WHERE areaid = 'South Coast')

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. SET - Microsoft अनुशंसित दृष्टिकोण
  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

SQL का उपयोग करते हुए ASSIGN चर का चयन करने के लिए सबसे अच्छा अभ्यास नीचे दिखाया गया है

->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;

यदि आपको एक ही लाइन में एक से अधिक वेरिएबल असाइन करने हैं तो आप इसी SELECT INTO का उपयोग कर सकते हैं

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

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

--HAPPY CODING-- 

"सर्वोत्तम अभ्यास" - स्रोत?
रोडनी एलिस

अगर यू में टेबल सेलेक्ट करने के लिए एक से अधिक कॉलम हैं तो यू कोड को दोहराने के बजाय एक ही सेलेक्ट इन्टो स्टेटमेंट का उपयोग करके आसानी से असाइन कर सकते हैं !!
वेंकज_वेनकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.