2013-02-19 58 views
5

क्यों मैं एक लूप में वही चर नाम घोषित कर सकता हूं लेकिन लूप के बिना अनुमति नहीं है?एसक्यूएल सर्वर चर: लूप बनाम डुप्लिकेट?

DECLARE @loop INT 

SET @loop = 0 

WHILE @loop<5 
BEGIN 
    DECLARE @t INT -- <-- This is called multiple times 
    SET @t = 1 
    SET @loop = @loop+1 
    SELECT @loop 
END 
  • इस पर अमल होगा:

    DECLARE @t INT 
        SET @t = 1 
        DECLARE @t INT 
        SET @t = 1 
    

    स्पष्ट रूप से कहेंगे:

    • 1,2,3,4,5

    इस जबकि परिवर्तनीय नाम '@t' पहले ही घोषित कर दिया गया है।

उत्तर

6

DECLARE रखने सारहीन

यह केवल वास्तव में कितनी बार के ब्लॉक में से एक चर पर ध्यान दिए बिना वाणी (सिवाय पार्सर आप कोशिश करते हैं और DECLARE से पहले इसका इस्तेमाल करने की अनुमति नहीं दी जाएगी) है घोषणा वाला कोड निष्पादित किया गया है।

DECLARE अपने आप में एक निष्पादन योग्य कथन नहीं है। जैसे

IF 1 = 0 
BEGIN 
DECLARE @I INT 
END 

SELECT @I 

ठीक काम करता है भले ही उस ब्लॉक को कभी भी दर्ज नहीं किया गया हो। चर के लिए स्मृति संकलन के समय संकलन समय पर आरक्षित है, क्वेरी के निष्पादन से पहले भी execution context में शुरू होता है।

इस को देखने का एक तरीका यह

DBCC FREEPROCCACHE; 

GO 

SELECT m2.pages_allocated_count 
     --If 2012 use the next line instead 
     --,m2.pages_in_bytes/m2.page_size_in_bytes as pages_allocated_count 
     ,m2.page_size_in_bytes 
FROM sys.dm_exec_cached_plans cp 
     CROSS apply sys.dm_exec_sql_text(cp.plan_handle) t 
     JOIN sys.dm_os_memory_objects m1 ON m1.memory_object_address = cp.memory_object_address 
     JOIN sys.dm_os_memory_objects m2 ON m1.page_allocator_address = m2.page_allocator_address 
WHERE text LIKE '%this query%' 
AND m2.type = 'MEMOBJ_EXECUTE' 

DECLARE @A0 VARCHAR(8000); 
DECLARE @A1 VARCHAR(8000); 
DECLARE @A2 VARCHAR(8000); 
DECLARE @A3 VARCHAR(8000); 
DECLARE @A4 VARCHAR(8000); 
DECLARE @A5 VARCHAR(8000); 
DECLARE @A6 VARCHAR(8000); 
DECLARE @A7 VARCHAR(8000); 
DECLARE @A8 VARCHAR(8000); 
DECLARE @A9 VARCHAR(8000); 
DECLARE @A10 VARCHAR(8000); 
DECLARE @A11 VARCHAR(8000); 
DECLARE @A12 VARCHAR(8000); 
DECLARE @A13 VARCHAR(8000); 
DECLARE @A14 VARCHAR(8000); 
DECLARE @A15 VARCHAR(8000); 
DECLARE @A16 VARCHAR(8000); 
DECLARE @A17 VARCHAR(8000); 
DECLARE @A18 VARCHAR(8000); 
DECLARE @A19 VARCHAR(8000); 
DECLARE @A20 VARCHAR(8000); 

जो स्मृति वर्तमान क्वेरी के लिए आरक्षित से पता चलता है, अगर आप चर घोषित आप स्मृति सुरक्षित परिवर्तन देखेंगे की संख्या को समायोजित है, भले ही DECLARE ब्लॉक पर सही है बैच का अंत

+0

जबकि लूप में यह परिवर्तनीय '@ t' 5 बार घोषित करेगा? – vikas

+0

@vikas - नहीं। 'DECLARE' कथन रन टाइम पर कुछ भी नहीं करते हैं। इसी तरह से मेरे उत्तर में उदाहरण कोड में ब्लॉक को 0 बार निष्पादित किया जाता है लेकिन वैरिएबल अभी भी वास्तव में घोषित किया जाता है। –

+0

सी # में लूप के लिए परिवर्तनीय घोषणा जैसे, या कुछ और – vikas