كيف يمكنني استخدام BCP أو Sql Server Management Studio للحصول على بيانات BLOB من Sql Server؟

StackOverflow https://stackoverflow.com/questions/2404709

سؤال

أنا آسف إذا تم طرح هذا السؤال بالفعل، ولكن لم أتمكن من العثور عليه في أي مكان.لدي جدول يقوم بتخزين الملفات على شكل BLOBS.العمود الذي يحتوي على الملف هو نوع بيانات صورة.أود أن أكون قادرًا على استخراج البيانات الثنائية من العمود وتحويلها إلى ملف فعلي.أود بشكل مثالي أن أكون قادرًا على القيام بذلك مع BCP أو استوديو الإدارة إن أمكن.

لقد قمت بتجريب BCP، ولكن لسبب ما عندما أحاول سحب مستند مكتبي، يعتقد Word أنه تالف.إليك ما جربته حتى الآن (من الواضح أنه تم تغيير القيم لحماية الأبرياء :):

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -n -S server -U username -P password

هذا لا يعمل بالرغم من ذلك؟أي أفكار؟

يحرر تبين أنك لا تحتاج إلى العلم الأصلي -n.أيضًا، يحاول BCP تضمين بادئة 4 بايت بشكل افتراضي في عمود الصورة - فأنت تريد بالفعل تعيين هذه القيمة على 0.

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password
Enter the file storage type of field document_binary [image]:
Enter prefix-length of field document_binary [4]: 0
Enter length of field document_binary [0]:
Enter field terminator [none]:
هل كانت مفيدة؟

المحلول

أنا أجيب على سؤالي لأنني أشعر بالانزعاج من طلب SO مني إعداد مكافأة

تبين أنك لا تحتاج إلى العلم الأصلي -n.أيضًا، يحاول BCP تضمين بادئة 4 بايت بشكل افتراضي في عمود الصورة - فأنت تريد بالفعل تعيين هذه القيمة على 0.

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password
Enter the file storage type of field document_binary [image]:
Enter prefix-length of field document_binary [4]: 0
Enter length of field document_binary [0]:
Enter field terminator [none]:

نصائح أخرى

إذا كان بإمكانك استخدام كود C# / .NET للقيام بذلك، فقد تكون مقالة قاعدة المعارف التالية مفيدة:

http://support.microsoft.com/kb/317016

من الواضح أنه يمكنك القيام بشيء كهذا باستخدام BCP وملف التنسيق، ولكن يجب ملء ملف التنسيق IIRC مسبقًا بالعدد الدقيق للبايتات التي يتوقع سحبها من العمود، مما يجعله غير عملي تمامًا.

هناك خيار آخر يمكنك اختياره وهو استخدام FILESTREAM في 2008، أو إذا كنت لا تخطط للانتقال إلى 2008 في أي وقت قريب، فقم بتخزين المستندات على نظام الملفات ومؤشر إليها في قاعدة البيانات.نعم هناك إيجابيات وسلبيات لهذا، ولكن هذه هي الطريقة التي اخترناها في جميع المشاريع حتى الآن.

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