दिलचस्प पोस्ट
Ctrl-Space दबाए बिना ईक्लिप्स में Ctrl-Space एकाधिक क्वेरीज़ के साथ php / mysql छवियों का आकार बदलने में फ़ायरफ़ॉक्स इतना बुरा क्यों है? LINQ में संस्थाओं के लिए दिनांक समय का उपयोग करना एक UITableViewCell में कुंजीपटल ऊपर UITextField स्क्रॉल करें एक नियमित UIViewController पर क्या मानचित्रण के लिए गोल कोनों को कार्यान्वित करने का कोई तरीका है? साक्षात्कार: जावा बराबर JavaFX "स्थान आवश्यक है।" भले ही यह एक ही पैकेज में है पायथन मल्टीप्रोसेसिंग पिकिंग त्रुटि कैसे git इतिहास में फ़ाइलों से पाठ को स्थानापन्न करने के लिए? कैसे PHP exec () रूट के रूप में चलाने के लिए? इकाई फ़्रेमवर्क 4.1 InverseProperty विशेषता फिक्स्ड अटैचमेंट पृष्ठभूमि इमेज फ़्लिकर / क्रोम में गायब हो जाता है जब सीएसएस ट्रांस्फ़ॉर्म के साथ युग्मित किया जाता है दिनचर्या – अगली मंगलवार प्राप्त करें WPF WebBrowser (3.5 एसपी 1) हमेशा शीर्ष पर- WPF में एचटीएमएल प्रदर्शित करने के लिए अन्य सुझाव

क्वेरी द्वारा प्रत्येक पंक्ति के लिए एक बार संग्रहीत प्रक्रिया को कैसे निष्पादित किया जाता है?

मेरे पास एक संग्रहीत कार्यविधि है जो एक निश्चित तरीके से उपयोगकर्ता डेटा बदलती है मैं इसे user_id पास करता हूं और यह बात करता है मैं एक मेज पर एक क्वेरी चलाने के लिए और फिर प्रत्येक user_id के लिए मैं उस उपयोगकर्ता_id पर एक बार संग्रहीत प्रक्रिया को चलाने के लिए मिलना चाहता हूँ

मैं इसके लिए प्रश्न कैसे लिखूंगा?

Solutions Collecting From Web of "क्वेरी द्वारा प्रत्येक पंक्ति के लिए एक बार संग्रहीत प्रक्रिया को कैसे निष्पादित किया जाता है?"

एक कर्सर का उपयोग करें

ADDENDUM: [एमएस एसक्यूएल कर्सर उदाहरण]

declare @field1 int declare @field2 int declare cur CURSOR LOCAL for select field1, field2 from sometable where someotherfield is null open cur fetch next from cur into @field1, @field2 while @@FETCH_STATUS = 0 BEGIN --execute your sproc on each row exec uspYourSproc @field1, @field2 fetch next from cur into @field1, @field2 END close cur deallocate cur 

एमएस एसक्यूएल में, यहां एक उदाहरण आलेख है I

ध्यान दें कि कर्सर सेट-आधारित परिचालनों की तुलना में धीमी है, लेकिन मैनुअल के मुकाबले अधिक-लूप; इस सवाल में अधिक जानकारी

अतिरिक्त 2: यदि आप कुछ रिकॉर्डों से अधिक प्रोसेसिंग करेंगे, तो उन्हें पहले एक अस्थायी तालिका में खींचें और अस्थायी तालिका पर कर्सर चलाएं; यह एसक्यूएल को एस्केटिंग से टेबल-लॉक में रोकेगा और ऑपरेशन की गति बढ़ा देगा

ADDENDUM 3: और ज़ाहिर है, अगर आप जो कुछ भी अपनी संग्रहीत कार्यप्रणाली प्रत्येक यूजर आईडी पर कर रहे हैं इनलाइन कर सकते हैं और एक ही एसक्यूएल अपडेट कथन के रूप में पूरी चीज को चला सकते हैं, जो इष्टतम होगा

यदि आपको लूप की आवश्यकता है तो अपना तरीका बदलने का प्रयास करें!

मूल संग्रहीत कार्यविधि के भीतर, एक #temp तालिका बनाएं जिसमें डेटा को संसाधित करने की आवश्यकता होती है। बच्चे को संग्रहीत कार्यविधि को कॉल करें, #temp तालिका दिखाई देगी और आप इसे संसाधित कर सकते हैं, उम्मीद है कि पूरे डेटा सेट और कर्सर या लूप के बिना काम कर रहे हैं।

यह वाकई इस बात पर निर्भर करता है कि यह बच्चा संग्रहीत प्रक्रिया क्या कर रहा है। यदि आप अपडेट हो रहे हैं, तो आप #temp तालिका में शामिल होने से "अपडेट करें" कर सकते हैं और एक कथन में सभी कार्य को किसी लूप के बिना कर सकते हैं। उसी को INSERT और DELETE के लिए किया जा सकता है। यदि आपको कई अपडेट करने की ज़रूरत है तो आप उन लोगों को #temp तालिका के साथ कई UPDATE FROM करने के लिए और CASE बयान या WHERE शर्तों का उपयोग कर सकते हैं।

जब किसी डाटाबेस में काम करते समय पाशन की मानसिकता खोने की कोशिश होती है, यह एक वास्तविक प्रदर्शन नाली है, जिससे लॉकिंग / अवरुद्ध किया जा सकता है और प्रसंस्करण धीमा हो सकता है। यदि आप हर जगह लूप करते हैं, तो आपका सिस्टम बहुत अच्छी तरह से स्केल नहीं करेगा, और उपयोगकर्ताओं को धीमी गति से रिफ्रेश के बारे में शिकायत करने के दौरान तेज होने में बहुत मुश्किल होगी।

इस प्रक्रिया की सामग्री पोस्ट करें जिसे आप लूप में कॉल करना चाहते हैं, और मैं 10 बार से 9 बार शर्त लगा सकता हूं, आप पंक्तियों के सेट पर काम करने के लिए इसे लिख सकते हैं।

आपकी तालिकाओं और फ़ील्ड नामों के लिए इस प्रतिस्थापन की आवश्यकता होगी।

 Declare @TableUsers Table (User_ID, MyRowCount Int Identity(1,1) Declare @i Int, @MaxI Int, @UserID nVarchar(50) Insert into @TableUser Select User_ID From Users Where (My Criteria) Select @MaxI = @@RowCount, @i = 1 While @i <= @MaxI Begin Select @UserID = UserID from @TableUsers Where MyRowCount = @i Exec prMyStoredProc @UserID Select @i = @i + 1, @UserID = null End 

क्या आपकी संग्रहीत कार्यविधि जो कुछ भी कर रही है उसे दोहराने के लिए उपयोगकर्ता-परिभाषित कार्य के साथ ये नहीं किया जा सकता?

 SELECT udfMyFunction(user_id), someOtherField, etc FROM MyTable WHERE WhateverCondition 

जहां udfMyFunction एक ऐसा फ़ंक्शन होता है जो उपयोगकर्ता ID में लेता है और जो कुछ भी आपको इसके साथ करने की आवश्यकता है।

थोड़ी अधिक पृष्ठभूमि के लिए http://www.sqlteam.com/article/user-defined-functions देखें

मैं मानता हूं कि जहां संभव हो वहां कर्सर को वास्तव में बचा जाना चाहिए। और यह आम तौर पर संभव है!

(ज़ाहिर है, मेरा जवाब यह मानता है कि आप केवल सपा से आउटपुट प्राप्त करने में दिलचस्पी रखते हैं और आप वास्तविक डेटा बदल नहीं रहे हैं। मुझे मूल प्रश्न से थोड़ा सा अस्पष्ट लगता है "विशिष्ट तरीके से उपयोगकर्ता डेटा बदलता है" इसलिए मैंने सोचा कि मैं इसे संभव समाधान के रूप में पेश करूंगा। आप क्या कर रहे हैं, इस पर स्पष्ट रूप से निर्भर करता है!)

आप इसे एक गतिशील क्वेरी से कर सकते हैं।

 declare @cadena varchar(max) = '' select @cadena = @cadena + 'exec spAPI ' + ltrim(id) + ';' from sysobjects; exec(@cadena); 

मुझे डेव रिंकन की गतिशील क्वेरी विधि पसंद है क्योंकि यह कर्सर का उपयोग नहीं करता है और यह छोटा और आसान है। साझा करने के लिए डेव धन्यवाद

लेकिन एज़्यूर एसक्यूएल पर मेरी जरूरतों के लिए और क्वेरी में "अलग" के साथ, मुझे इस तरह से कोड को संशोधित करना पड़ा:

 Declare @SQL nvarchar(max); -- Set SQL Variable -- Prepare exec command for each distinctive tenantid found in Machines SELECT @SQL = (Select distinct 'exec dbo.sp_S2_Laser_to_cache ' + convert(varchar(8),tenantid) + ';' from Dim_Machine where iscurrent = 1 FOR XML PATH('')) --for debugging print the sql print @SQL; --execute the generated sql script exec sp_executesql @SQL; 

मुझे उम्मीद है इससे किसी को सहायता मिलेगी…