2010-03-08 8 views
9

Je suis désolé si cette question a déjà été posée, mais je ne l'ai trouvé nulle part. J'ai une table qui stocke des fichiers en tant que BLOBS. La colonne qui contient le fichier est un type de données image. Je voudrais être en mesure d'extraire les données binaires hors de la colonne et le transformer en un fichier réel. Idéalement, j'aimerais pouvoir le faire avec BCP ou un studio de gestion si possible.Comment utiliser BCP ou Sql Server Management Studio pour extraire des données BLOB de Sql Server?

J'ai essayé le protocole BCP, mais pour une raison quelconque, lorsque j'essaie de sortir un document Office, Word pense qu'il est corrompu. Voici ce que j'ai essayé jusqu'à présent (évidemment les valeurs ont été changés pour protéger l'innocent :):

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

Ce ne fonctionne pas bien? Des pensées?

Édition Il s'avère que vous n'avez pas besoin du drapeau natif -n. En outre, BCP essaie d'inclure un préfixe de 4 octets par défaut sur la colonne d'image - que vous voulez réellement cet ensemble à 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]: 

Répondre

20

Je réponds à ma question puisque je suis en train de me fâcher avec SO dire de configurer une prime

s'avère que vous n'avez pas besoin du drapeau natif -n. En outre, BCP essaie d'inclure un préfixe de 4 octets par défaut sur la colonne d'image - que vous voulez réellement cet ensemble à 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]: 
0

Si vous pouvez utiliser C#/code .NET pour ce faire, les éléments suivants KB article peut être utile:

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

Apparemment, vous pouvez faire quelque chose comme ça avec BCP et un fichier de format, mais IIRC le fichier de format doit être pré-rempli avec le nombre exact d'octets qu'il attend tirer de la colonne, ce qui le rend tout à fait impraticable. Une autre option que vous pouvez choisir est d'utiliser FILESTREAM en 2008 ou, si vous ne prévoyez pas de migrer vers 2008 pour bientôt, de stocker les documents sur le système de fichiers et un pointeur vers eux dans la base de données. Oui, il y a des avantages et des inconvénients à cela, mais c'est la façon dont nous avons choisi dans tous les projets à ce jour.

+0

Je Aaron, nous faisons effectivement stocker tous nos documents sur le système de fichiers 95 % de notre application. Il y a un peu qui utilise encore blobs bien :( – Eric

+0

Vous n'avez pas besoin d'effectuer une pré-remplir le fichier de format avec la longueur du champ, les travaux suivants pour moi (sauts de ligne après '9.0' et ce qui suit '1): '9,0 1 SqlBinary 0 0 « » 1 col1 « »' – Geoff

+0

@ Aaron - apparemment, il y a beaucoup de problèmes avec l'exportation varbinary (max) à déposer (je viens de faire fini avec C# -. au bout de 3 heures à essayer de faites-le avec BCP). (le problème est avec refix-length de champ document_binary' qui devrait être réglé sur '0' - mais il nécessite une interaction de l'utilisateur.) Il peut également être fait avec le fichier FMT. accès au fichier FMT? existe-t-il un moyen d '"utiliser en ligne" le contenu fmt dans la commande bcp? –

Questions connexes