2010-10-15 6 views

उत्तर

338

Quote, जो this article से सार रखते हैं:

  1. सेट चर कार्य के लिए एएनएसआई मानक है, का चयन नहीं है।
  2. एसईटी एक समय में केवल एक चर निर्दिष्ट कर सकता है, चयन एक साथ कई असाइनमेंट कर सकता है।
  3. यदि किसी क्वेरी से असाइन करना है, तो एसईटी केवल स्केलर मान असाइन कर सकता है। यदि क्वेरी एकाधिक मान/पंक्तियां लौटाती है तो एसईटी एक त्रुटि उठाएगा। चयन वैरिएबल को मानों में से एक को असाइन करेगा और इस तथ्य को छुपाएगा कि कई मान वापस लौटाए गए थे (इसलिए आपको शायद कभी पता नहीं चलेगा कि कुछ और गलत क्यों हो रहा था - मज़ेदार समस्या निवारण करें)
  4. यदि कोई क्वेरी से असाइन करते समय कोई मूल्य वापस नहीं किया गया है, फिर एसईटी एनयूएलएल असाइन करेगा, जहां चयन असाइनमेंट नहीं करेगा (इसलिए चर को इसके पिछले मान से नहीं बदला जाएगा)
  5. गति अंतर के रूप में - एसईटी और चयन के बीच कोई प्रत्यक्ष अंतर नहीं है । हालांकि एक शॉट में एकाधिक असाइनमेंट करने की चयन करने की क्षमता एसईटी पर थोड़ा सा गति प्रदान करती है।
+3

मैं downvote नहीं था, लेकिन निम्नलिखित काफी सही नहीं है: "जहाँ तक गति मतभेद के रूप में - कोई सीधा मतभेद देखते हैं एसईटी और चयन के बीच "। यदि आप एक मान में एकाधिक मान असाइन करते हैं, तो यह बहुत तेज़ हो सकता है कि maultiple सेट के माध्यम से। Google अप "एक चयन के साथ एकाधिक चर असाइन करना तेजी से काम करता है" –

+11

@AlexKuznetsov: बाद में वाक्य बिल्कुल कहता है। –

+1

@ ओएमजी टट्टू: यह 10 गुना तेज या अधिक हो सकता है, इसलिए मुझे यकीन नहीं है कि यह "मामूली गति लाभ" है या नहीं। –

121

मेरा मानना ​​है कि 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' */ 
+4

+1 यह समझने के लिए एक बार चलाने के लिए बेहतर है कि इसे पढ़ने के लिए, जांचें, चलाएं, याद रखें कि केवल पढ़ने के लिए, लेकिन अन्य उत्तरों केवल –

+4

हैं यदि आप वास्तव में 'select @var = का उपयोग करते हैं (name.sys.tables से नाम का चयन करें जहां नाम = 'qwerty') 'आप @ var को शून्य के रूप में प्राप्त करेंगे। जो उदाहरण आप दे रहे हैं वह वही प्रश्न नहीं है। – Zack

+4

@Zack आप पूरी तरह से उदाहरण के बिंदु को याद कर चुके हैं। –

16

जब प्रश्नों लेखन, इस अंतर को ध्यान में रखा जाना चाहिए:

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*/ 
+0

बहुत अच्छा, संक्षेप – SimplyInk

संबंधित मुद्दे