अगर आपको जरूरी iterate(*), इसे करने के लिए डिज़ाइन किए गए निर्माण का उपयोग करें - कर्सर ए> . बहुत बदनाम, लेकिन अगर यह आपके इरादों को सबसे स्पष्ट रूप से व्यक्त करता है, तो मैं कहता हूं कि इसका इस्तेमाल करें:
DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter
OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
exec myproc @ID
FETCH NEXT FROM IDs into @ID
END
CLOSE IDs
DEALLOCATE IDs
(*) इस उत्तर को हाल ही में कुछ अपवोट मिले हैं, लेकिन मुझे लगता है कि मुझे अपनी मूल टिप्पणी यहां भी शामिल करनी चाहिए, और कुछ सामान्य सलाह जोड़ना चाहिए:
SQL में, आपको आम तौर पर . करना चाहिए एक सेट-आधारित समाधान की तलाश करें। पूरी भाषा सेट-आधारित समाधानों के इर्द-गिर्द उन्मुख है, और (बदले में) ऑप्टिमाइज़र सेट-आधारित समाधानों को अच्छी तरह से काम करने के लिए उन्मुख है। इसके अलावा, हमारे पास ट्यूनिंग . के लिए जो टूल उपलब्ध हैं ऑप्टिमाइज़र भी सेट-ओरिएंटेड है - उदा। तालिकाओं पर अनुक्रमणिका लागू करना।
कुछ कुछ हैं ऐसी स्थितियां जहां पुनरावृत्ति सबसे अच्छा तरीका है। ये बहुत कम हैं, और इनकी तुलना जैक्सन के अनुकूलन के नियमों से की जा सकती है - ऐसा न करें - और (केवल विशेषज्ञों के लिए) इसे न करें अभी तक ।
प्रभावित होने वाली सभी पंक्तियों के सेट के संदर्भ में आप जो चाहते हैं उसे तैयार करने का प्रयास करने के लिए आप पहले से बेहतर सेवा कर रहे हैं - प्राप्त करने के लिए समग्र परिवर्तन क्या है? - और फिर उस लक्ष्य को समाहित करने वाली क्वेरी तैयार करने का प्रयास करें। केवल अगर ऐसा करने से उत्पन्न क्वेरी पर्याप्त रूप से प्रदर्शन नहीं कर रही है (या कोई अन्य घटक है जो व्यक्तिगत रूप से प्रत्येक पंक्ति से निपटने के अलावा कुछ भी करने में असमर्थ है) तो क्या आपको विचार करना चाहिए पुनरावृति।