سؤال

إذا قمت بتشغيل الاستعلام التالي في محلل استعلام SQL Server 2000:

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

في ملف نصي يتوافق مع مخطط OurTable المكون من 40 سطرًا، ولكن بعد ذلك يغير تنسيق آخر 20 سطرًا (لنفترض أن آخر 20 سطرًا تحتوي على حقول أقل)، أتلقى خطأ.ومع ذلك، فإن أول 40 سطرًا ملتزمون بالجدول.هل هناك شيء ما في الطريقة التي أتصل بها بـ Bulk Insert يجعلها غير معاملية، أو هل أحتاج إلى القيام بشيء واضح لإجبارها على التراجع عند الفشل؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

يمكنك التراجع عن الإدراجات.للقيام بذلك علينا أن نفهم شيئين أولا

BatchSize

:عدد الصفوف التي سيتم إدراجها لكل معاملة.الافتراضي هو ملف بيانات كامل.لذا فإن ملف البيانات قيد المعاملة

لنفترض أن لديك ملفًا نصيًا يحتوي على 10 صفوف والصف 8 والصف 7 يحتوي على بعض التفاصيل غير الصالحة.عندما تقوم بإدراج الملف بشكل مجمّع دون تحديد حجم الدُفعة أو تحديده، يتم إدراج 8 من 10 في الجدول.الصف غير صالح، على سبيل المثال.فشل الثامن والسابع ولم يتم إدراجهما.

يحدث هذا بسبب الافتراضي MAXERRORS العدد هو 10 لكل معاملة.

حسب MSDN:

الحد الأقصى للأخطاء :

يحدد الحد الأقصى لعدد أخطاء بناء الجملة المسموح به في البيانات قبل إلغاء عملية الاستيراد بالجملة.يتم تجاهل كل صف لا يمكن استيراده بواسطة عملية الاستيراد بالجملة وحسابها كخطأ واحد.إذا لم يتم تحديد max_errors، فإن القيمة الافتراضية هي 10.

لذا، لكي نفشل في جميع الصفوف العشرة حتى لو كان أحدها غير صالح، نحتاج إلى تعيينه MAXERRORS=1 و BatchSize=1 وهنا يهم أيضًا عدد BatchSize.

إذا قمت بتحديد BatchSize وكان الصف غير الصالح موجودًا داخل مجموعة معينة، فسيتم التراجع عن الدفعة المحددة فقط، وليس مجموعة البيانات بأكملها.لذا كن حذرًا أثناء اختيار هذا الخيار

نأمل أن يحل هذا المشكلة.

كما جاء في BATCHSIZE تعريف للإدراج المجمع في مكتبة MSDN (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) :

"إذا فشل هذا، يقوم SQL Server بتنفيذ المعاملة أو التراجع عنها لكل دفعة..."

في الختام، ليس من الضروري إضافة المعاملات إلى الإدخال المجمع.

حاول وضعه داخل معاملة محددة من قبل المستخدم وشاهد ما سيحدث.في الواقع يجب أن يتراجع كما وصفته.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top