2013-05-11 8 views
5

परिदृश्य से रिकॉर्ड्स बैच-वार प्राप्त करने का सबसे अच्छा तरीका क्या है: हम SQL सर्वर से C# .NET कंसोल एप्लिकेशन से पंक्तियां ला रहे हैं और संग्रहीत प्रक्रिया के माध्यम से SQL सर्वर से पुनर्प्राप्त डेटा पर कार्रवाई कर रहे हैं; कार्रवाई के बाद नया डेटा मोंडो डीबी में सी # -मोन्गो डीबी-चालक का उपयोग करके संग्रहीत किया जाता है।SQL सर्वर

अंक: अरबों पंक्तियां हैं।

select * from table_name 

कुछ बैच के लिहाज से तर्क कोई पहचान नहीं स्तंभ है और न ही किसी भी तारीख कॉलम या इस तरह के है बाहर काम करने के लिए: मेरे संग्रहीत प्रक्रिया क्वेरी के रूप में निम्नानुसार हैं।

सूचना: अब आवेदन 3500 तक रिकॉर्ड प्राप्त करने में कठिनाई है के रूप में - 5000 के रिकॉर्ड और MongoDB में भंडारण और फिर इसे एक त्रुटि जो इस प्रकार है फेंकता है:

System.Runtime.InteropServices.SEHException (0x80004005): बाहरी घटक ने अपवाद फेंका है।

प्रश्न: किसी को मेरे/बैच के लिहाज से पढ़ने के लिए बाहर काम एसक्यूएल सर्वर से लाने के लिए कुछ तर्क सुझाव है कि कर सकते हैं?

उत्तर

9

लाएं के साथ आप एसक्यूएल सर्वर 2012 में OFFSET-FETCH उपयोग नहीं कर सकते और टेबल संभालने प्राथमिक कुंजी है या स्तंभ (रों) है कि आप विशिष्ट एक पंक्ति पहचान करने की अनुमति देता है इसे कहते UniqueKey, तो 2005 में ऊपर की तरफ आप ROW_NUMBER इस तरह इस्तेमाल कर सकते हैं ...

SELECT UniqueKey, col2, col3 
FROM 
(
    SELECT UniqueKey, col2, col3, ROW_NUMBER() OVER (ORDER BY UniqueKey) AS RowNum 
    FROM YourTable 
) sub 
WHERE sub.RowNum BETWEEN @startRow AND @endRow 

तुम सच में कोई अद्वितीय कुंजी या तो आप इस्तेमाल कर सकते हैं जोड़ने की संभावना ...

ROW_NUMBER() OVER (ORDER BY (SELECT 0)) 

... कोशिश करते हैं और प्राकृतिक व्यवस्था है कि रिकॉर्ड में जमा हो जाती है बनाए रखने के लिए है। लेकिन, के आधार पर अपने डेटा संरचना, यह बिल्कुल काम करने की गारंटी नहीं है कि आप इसे कैसे चाहते हैं। तो, माइग्रेशन का परीक्षण करना और भी महत्वपूर्ण होगा, लेकिन मुझे यकीन है कि आप वैसे भी ऐसा करेंगे ;-)

7

यदि आप एमएसएसएलएल 2012 का उपयोग करते हैं तो ऑफ़सेट-फ़ेच क्लॉज का प्रयास करें। यह सबसे अच्छा समाधान है!

examle: का चयन करें ... आदेश OrderID की भरपाई 25 पंक्तियां अगले 25 पंक्तियां केवल

It means this query will return from 25 to 50 records. 
ORDER BY clause is mandatory, so if dont want to use order, 
just write like: ....ORDER BY (SELECT NULL)..... 
+0

प्रश्न टैग सुझाव देंगे कि वे SQL Server 2008 – davmos

+0

का उपयोग कर रहे हैं हां सबसे अच्छा समाधान जो आपने प्रस्तावित किया था, बशर्ते हम हैं एमएस एसक्यूएल 2012 पर। लेकिन हम एमएस एसक्यूएल 2008 और 2008 आर 2 पर हैं .. आपके समय के लिए धन्यवाद .. –