Estoy intentando exportar un número bastante grande de archivos de imagen, almacenada internamente en una base de datos SQL como datos binarios.Exportación de datos de archivos binarios (imágenes) de SQL a través de un procedimiento almacenado
ser bastante nuevo en la escritura de procedimientos almacenados en SQL, me he encontrado con un par de guías muy útiles sobre cómo esto puede ser archivado, pero me parece que falta algo.
estoy corriendo SQL Server 2008 R2 a nivel local, y yo estoy tratando de escribir los archivos a una carpeta de mi unidad C: \.
Aquí es la parte buisness de lo que tengo hasta ahora:
BEGIN
DECLARE @cmd VARCHAR(8000)
DECLARE @result int
DECLARE curExportBinaryDocs CURSOR FAST_FORWARD FOR
SELECT 'BCP "SELECT Photograph_Data FROM [ALBSCH Trial].[dbo].[Photograph] WHERE Photograph_ID = '
+ CAST(Photograph_ID AS VARCHAR(500)) + '" queryout "' + @OutputFilePath
+ CAST(Photograph_ID AS VARCHAR(500)) + '.jpg"' + ' -n -T'
FROM dbo.Photograph
OPEN curExportBinaryDocs
FETCH NEXT FROM curExportBinaryDocs INTO @cmd
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT @cmd
EXEC @result = xp_cmdshell @cmd
FETCH NEXT FROM curExportBinaryDocs INTO @cmd
END
CLOSE curExportBinaryDocs
DEALLOCATE curExportBinaryDocs
END
'@result' siempre está siendo puesto a '1' (fallidos) después de la llamada xp_cmdshell. Todos los nombres/campos de la tabla son correctos, así que sospecho que hay algo mal con mi llamada BCP, pero no estoy seguro de qué probar a continuación.
Cualquier ayuda o consejo sería muy bienvenido.
¿Cómo está ejecutando el SQL? El SQL se ejecuta con las credenciales de un usuario ... ¿Tiene ese usuario derechos para crear archivos en la carpeta de salida? –
Estoy iniciando sesión en el servidor SQL utilizando mi nombre de usuario de windows habitual y la autenticación de Windows. He logrado que una solución funcione usando el método descrito aquí: http://stackoverflow.com/questions/1366544/how-to-export-image-field-to-file pero si es posible me gustaría llegar a el fondo del problema que estoy teniendo con mi método original, ¡solo por tranquilidad! – ChrisMurray
Creo que lo que estás haciendo está un poco mal. ¿Conoce la "base de datos de habilitación de flujo de archivos" de SQL Server? Le permite almacenar BLOBs en la Unidad de Disco Duro mientras los BLOB aún son mantenidos por su Servidor SQL. Después de enviar estos BLOB a la unidad, su aplicación solo necesita realizar una consulta en su base de datos y obtener el objeto. Además, usar el cursor no es algo bueno (es lento). – gotqn