2010-06-01 9 views
13

चूंकि @ ए को कभी घोषित नहीं किया गया है, एसक्यूएल सर्वर को एक त्रुटि फेंकनी चाहिए, लेकिन ऐसा नहीं है। ऐसा क्यों है?कंडीशन घोषित IF कथन के अंदर क्यों घोषित किया गया है जब भी स्थिति गलत होती है?

DECLARE @i int = 1; 
IF @i > 10 
BEGIN 
    DECLARE @A int = 100; 
END 

PRINT @A; // doesn't return any result 

thanx

+1

+1: अच्छा प्रश्न। –

उत्तर

15

एसक्यूएल सर्वर ब्लॉक स्तर चर scoping जरूरत नहीं है।

यह प्रति बैच है/संग्रहीत proc आदि

From MSDN (मेरी बोल्ड)

एक चर का दायरा Transact SQL कथन कि कर सकते हैं संदर्भ चर की सीमा है। एक चर का दायरा बिंदु यह बैच या संग्रहीत प्रक्रिया जिसमें यह घोषित है के अंत तक घोषित किया जाता है से रहता है।

+0

समझ में आता है, लेकिन यह इस तरह की त्रुटियों का दोष नहीं है, क्योंकि शायद ऐसी परिस्थितियां हैं जहां हम केवल कुछ चर स्थित होने पर एक चर बनाना चाहते हैं? – AspOnMyNet

+3

वास्तव में नहीं। एसक्यूएल संकलित नहीं है या C# की तरह scoped है, कहते हैं, क्योंकि यह घोषणात्मक है। एक डेवलपर डीबीए के रूप में, मैं कह सकता हूं कि सी # और जावा उनके स्कॉइंग नियमों के कारण त्रुटिपूर्ण हैं, बाहरी और आंतरिक ब्लॉक में घोषित चर के साथ। मेरा मतलब है, 2 @ ए युद्ध हैं? – gbn

+0

thanx – AspOnMyNet

4

GBN के प्रश्न का उत्तर है, लेकिन एक संबंधित नोट पर, इस तरह कोड के लिए बाहर देखने के लिए:

DECLARE @i INT = 0 
WHILE @i < 2 
BEGIN 
    DECLARE @a VARCHAR(100) 

    IF @i = 0 
     SET @a = 'changed' 

    PRINT COALESCE(@a, 'is null') 
    SET @i = @i + 1 
END 

जब रन, यह "बदला" प्रिंट में दो बार, कई लोगों को शायद प्रिंट यह उम्मीद होती है, जबकि "बदल गया", फिर "शून्य है"। लूप के अंदर चर घोषित करते समय सावधान रहें। आप स्पष्ट रूप से घोषणा में इसे पूर्ण रूप से सेट करना चाहते हैं। जैसे

DECLARE @a VARCHAR(100) = NULL 

जब यह संशोधित संस्करण चलाया जाता है, तो यह "बदले" को प्रदर्शित करता है, फिर "शून्य है"।

+0

मेरी मदद करने के लिए अच्छा सलाह। शायद मुझे वह याद आएगा। thanx – AspOnMyNet

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