2008-09-03 18 views
14

अगर मैं एसक्यूएल सर्वर में निम्न क्वेरी 2000 क्वेरी विश्लेषक चलाएँ:एसक्यूएल सर्वर थोक सम्मिलित लेनदेन है?

BULK INSERT OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK) 

एक पाठ फ़ाइल है कि 40 लाइनों के लिए OurTable स्कीमा के अनुरूप है पर है, लेकिन फिर पिछले 20 लाइनों के लिए प्रारूप बदलता है (कहना देता है पिछले 20 लाइनों में कम फ़ील्ड हैं), मुझे एक त्रुटि मिलती है। हालांकि, पहली 40 लाइनें टेबल पर प्रतिबद्ध हैं। क्या मैं थोक सम्मिलन को कॉल करने के तरीके के बारे में कुछ हूं जो इसे लेनदेन नहीं करता है, या क्या मुझे विफलता पर रोलबैक करने के लिए मजबूर करने के लिए कुछ स्पष्ट करने की आवश्यकता है?

उत्तर

18

BULK INSERT व्यक्तिगत INSERT कथन की श्रृंखला के रूप में कार्य करता है और इस प्रकार, अगर नौकरी विफल हो जाती है, तो यह सभी प्रतिबद्ध आवेषणों को वापस नहीं लाती है।

यह, हालांकि, एक सौदे के भीतर रखा जा सकता है ताकि आप कुछ इस तरह कर सकता है:

BEGIN TRANSACTION 
BEGIN TRY 
BULK INSERT OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
    ROWS_PER_BATCH = 10000, TABLOCK) 
COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
ROLLBACK TRANSACTION 
END CATCH 
+2

यदि आप बहुत सारी पंक्तियां डाल रहे हैं तो लेनदेन लॉग भरने से सावधान रहें। –

0

इसे उपयोगकर्ता द्वारा परिभाषित लेनदेन के अंदर डालने का प्रयास करें और देखें कि क्या होता है। असल में इसे रोल-बैक करना चाहिए जैसा आपने वर्णन किया था।

2

के रूप में MSDN लाइब्रेरी में बल्क सम्मिलित करें के लिए BATCHSIZE परिभाषा (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) में कहा गया है:

" यदि यह विफल हो जाता है, तो SQL सर्वर प्रत्येक बैच के लिए लेनदेन को वापस या रोल करता है ... "

बल्क सम्मिलन में लेनदेन को जोड़ने के लिए निष्कर्ष निकालना आवश्यक नहीं है।

+0

[माइक्रोसॉफ्ट प्रलेखन suckzz !!] (http://technet.microsoft.com/es-es/library/ms188365.aspx) दो दिन का परीक्षण और आखिरकार मैंने नोट किया कि बल्क इनसर्ट संकलन स्तर लेनदेन त्रुटि पर रोलबैक का समर्थन नहीं करता है। मेरा मतलब है कि आपको थोक सम्मिलित क्वेरी के लिए एक संग्रहित प्रक्रिया बनाने की आवश्यकता है, फिर "try/catch" के साथ अपना_प्रोसेडर निष्पादित करें। तत्काल पहली त्रुटि को पकड़ने के लिए MAXERRORS = 0 को भी परिभाषित करना बहुत महत्वपूर्ण है। –

2

आप आवेषण रोलबैक कर सकते हैं। पंक्तियों की कोई प्रति लेन-देन सम्मिलित करने के लिए: यह है कि हम पहले

BatchSize

दो बातें समझने की जरूरत है ऐसा करने के लिए। डिफ़ॉल्ट डेटा फ़ाइल है। तो लेनदेन

कहें कि आपके पास एक टेक्स्ट फ़ाइल है जिसमें 10 पंक्तियां और पंक्ति 8 है और पंक्ति 7 में कुछ अमान्य विवरण हैं। जब आप बल्क आकार निर्दिष्ट या निर्दिष्ट किए बिना फ़ाइल सम्मिलित करते हैं, तो 10 में से 8 तालिका में डाले जाते हैं। अमान्य पंक्ति यानी 8 वीं और 7 वीं विफल हो जाती है और उसे सम्मिलित नहीं किया जाता है।

ऐसा होता है क्योंकि डिफ़ॉल्ट MAXERRORS गणना प्रति लेनदेन 10 है।

प्रति MSDN के रूप में:

MAXERRORS:

वाक्यविन्यास त्रुटियों थोक आयात ऑपरेशन से पहले डेटा में की अधिकतम संख्या निर्दिष्ट करता है रद्द कर दिया गया है। थोक-आयात ऑपरेशन द्वारा आयात की गई प्रत्येक पंक्ति को अनदेखा नहीं किया जा सकता है और एक त्रुटि के रूप में गिना जाता है। max_errors निर्दिष्ट नहीं है, तो डिफ़ॉल्ट 10.

तो सभी 10 पंक्तियों विफल Inorder भले ही एक अमान्य है हम MAXERRORS=1 और BatchSize=1 स्थापित करने के लिए यहाँ BatchSize की संख्या भी मायने रखती है की जरूरत है।

यदि आप बैचसाइज निर्दिष्ट करते हैं और अमान्य पंक्ति विशेष बैच के अंदर है, तो यह केवल विशेष बैच को रोलबैक करेगा, न कि संपूर्ण डेटा सेट। तो इस विकल्प को चुनते समय सावधान रहें

आशा है कि यह समस्या हल करेगी।

+0

व्यक्तिगत INSERT कथन रखने के बजाय बैचसाइज = 1 का क्या बिंदु है? – proteus

+0

मुझे लगता है कि बैच आकार = 1 लेनदेन करता है जो अलग-अलग सम्मिलन विवरणों के समान होता है लेकिन बाद में कुछ लूप और पंक्ति संख्याओं को डुप्लिकेशंस के बिना डालने की आवश्यकता होती है। अपने बयान के साथ सहमत हैं लेकिन यह बल्क इन्टरनेट विशेषताओं की मदद से किया जा सकता है –

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