2010-03-08 25 views
9

Lo siento si esta pregunta ya se ha hecho, pero no pude encontrarla en ningún lado. Tengo una tabla que almacena archivos como BLOBS. La columna que contiene el archivo es un tipo de datos de imagen. Me gustaría poder extraer los datos binarios de la columna y convertirlos en un archivo real. Idealmente, me gustaría poder hacer esto con BCP o con el estudio de administración si es posible.¿Cómo uso BCP o Sql Server Management Studio para obtener datos BLOB de SQL Server?

He intentado con BCP, pero por alguna razón cuando intento sacar un documento de Office Word cree que está dañado. Esto es lo que he probado hasta ahora (obviamente, los valores han sido cambiados para proteger al inocente :):

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

Esto no está funcionando, aunque? ¿Alguna idea?

Editar Resulta que no es necesario el distintivo nativo -n. Además, el BCP intenta incluir un prefijo de 4 bytes por defecto en la columna de la imagen - que realmente quiere este conjunto 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]: 

Respuesta

20

Estoy respondiendo a mi propia pregunta desde que estoy molesto con SO diciéndome que configurar una recompensa

Resulta que no es necesario la bandera nativa -n. Además, el BCP intenta incluir un prefijo de 4 bytes por defecto en la columna de la imagen - que realmente quiere este conjunto 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

Si puede utilizar el código C#/.NET para hacer esto, el siguiente KB artículo puede ser útil:

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

Aparentemente se puede hacer algo como esto con BCP y un archivo de formato, pero IIRC el archivo de formato tiene que ser pre-pobladas con el número exacto de bytes que está a la espera tirar de la columna, lo que lo hace bastante poco práctico.

Otra opción que puede elegir es usar FILESTREAM en 2008 o, si no planea migrar a 2008 en el corto plazo, almacene los documentos en el sistema de archivos y un puntero a ellos en la base de datos. Sí, hay ventajas y desventajas en esto, pero es la forma que hemos elegido en todos los proyectos hasta la fecha.

+0

que Aaron, que en realidad hacemos almacenar todos nuestros documentos en el sistema de archivos para el 95 % de nuestra aplicación. Sin embargo, hay un bit que todavía usa blobs :( – Eric

+0

No necesita rellenar previamente el archivo de formato con la longitud del campo; lo siguiente funciona para mí (saltos de línea después de '9.0' y el siguiente' 1'): '9.0 1 SQLBINARY 0 0" "1 col1" "' – Geoff

+0

@aaron - aparentemente hay muchos problemas con exportar varbinary (max) al archivo. (Acabo de terminar de hacerlo con C# - después de 3 horas tratando de hazlo con BCP). (El problema es con 'refix-length of field document_binary' que se debe establecer en' 0', pero requiere interacción del usuario). También se puede hacer con el archivo FMT, pero ¿qué ocurre si no tengo acceso al archivo FMT? ¿hay alguna manera de "usar en línea" el contenido fmt dentro del comando bcp? –

Cuestiones relacionadas