2010-03-08 18 views
9

Mi dispiace se questa domanda è già stata fatta, ma non ho potuto trovarla da nessuna parte. Ho una tabella che memorizza i file come BLOB. La colonna che contiene il file è un tipo di dati immagine. Mi piacerebbe essere in grado di estrarre i dati binari dalla colonna e trasformarli in un file reale. Preferirei essere in grado di farlo con BCP o Management Studio, se possibile.Come utilizzare BCP o Sql Server Management Studio per estrarre i dati BLOB dal server Sql?

ho provato BCP, ma per qualche ragione quando cerco di tirare fuori un documento di Office Word pensa che sia corrotto. Ecco quello che ho provato finora (ovviamente i valori sono stati cambiati per proteggere l'innocente :):

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

Questo non funziona però? qualche idea?

Modifica Risulta che non è necessario il flag -n nativo. Inoltre, BCP tenta di includere un prefisso 4 byte per impostazione predefinita per la colonna immagine - si vuole realmente questo set a 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]: 

risposta

20

sto rispondendo alla mia domanda in quanto mi sto seccato con me dicendo SO di impostare una taglia

scopre che non è necessario il flag nativo -n. Inoltre, BCP tenta di includere un prefisso 4 byte per impostazione predefinita per la colonna immagine - si vuole realmente questo set a 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

Se è possibile utilizzare codice C#/.NET per fare questo, il seguente KB articolo può rivelarsi utile:

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

a quanto pare si può fare qualcosa di simile con BCP e un file di formato, ma IIRC il file di formato deve essere pre-popolato con il numero esatto di byte che si aspetta tirare dalla colonna, il che lo rende piuttosto poco pratico.

Un'altra opzione che è possibile scegliere è l'utilizzo di FILESTREAM nel 2008 o, se non si prevede di eseguire la migrazione fino al 2008 in qualsiasi momento, memorizzare i documenti nel file system e un puntatore nel database. Sì, ci sono pro e contro, ma è il modo in cui abbiamo scelto finora tutti i progetti.

+0

I Aaron, che in realtà facciamo memorizzare tutti i nostri documenti sul filesystem per il 95 % della nostra applicazione. C'è un po 'che utilizza ancora blob però :( – Eric

+0

Non c'è bisogno di precompilare il file di formato con la lunghezza del campo, i seguenti lavori per me (interruzioni di riga dopo '9.0' e il seguente' 1'): '9.0 1 SQLBINARY 0 0" "1 col1" "' – Geoff

+0

@aaron - a quanto pare ci sono molti problemi con l'esportazione di varbinary (max) in file. (Ho appena finito di farlo con C# - dopo 3 ore di tentativi di fallo con BCP). (il problema è con 'refix-length of field document_binary' che dovrebbe essere impostato su' 0' - ma richiede l'interazione dell'utente.) Può anche essere fatto con il file FMT, ma cosa succede se non ho accesso al file FMT? C'è un modo per "utilizzare in linea" il contenuto fmt all'interno del comando bcp? –

Problemi correlati