Как экспортировать столбец изображения в файлы в SQL Server?

13

Я буду мигрировать из базы данных. Есть один столбец типа, imageкоторый я хотел бы экспортировать в двоичные файлы в файловой системе. Один файл для каждой записи. Как я могу сделать это с SQL Server?

Jonas
источник
1
Хорошая запись от Амны
aasim.abdullah
1
Возможно, я бы выбил простой поток данных служб SSIS с помощью преобразования столбца экспорта
Мартин Смит,

Ответы:

13

Это решение, которое я придумал:

  1. Включить xp_cmdshellс

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. При необходимости создайте каталог, xp_cmdshellчтобы получить необходимые разрешения.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Используйте BCP с запросом

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** your_db должно быть полным именем таблицы, т. е. [Yourdb]. [YourSchema]. [YourTable]

Jonas
источник
1
Я попробовал приведенный выше код, и он действительно работал ... в точку. По какой-то причине изображение JPG содержит 4 предшествующих символа, которые делают его недействительным. Я удалил их с помощью текстового редактора и вуаля ... JPG работал. Любая идея, что эти 4 символа могут быть и как избавиться от них в экспорте? Это:2B 90 01 00
Какой тип столбца вы экспортировали?
Макс Вернон
10

У меня была такая же проблема с дополнительными 4 байтами, добавляемыми в начало всех моих файлов. Вместо использования опции -N в моей команде bcp я изменил ее на -C RAW. Когда вы это сделаете, bcp будет предложено ответить на следующие вопросы:

Введите тип хранилища файлов в поле FileData [изображение]:
Введите префиксную длину поля FileData [4]:
Введите длину поля FileData [0]:
Введите терминатор поля [нет]: 
Вы хотите сохранить информацию этого формата в файл? [Y / N]

Чтобы исправить это, я создал текстовый файл (i.txt) в корне моего сервера sql, в котором были следующие строки для ответа на каждый из них:

я
0
0

N

Затем моя линия EXEC bcp стала:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1" запрос "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'

Это экспортировал мой файл без каких-либо дополнительных символов.

Джейкоб Дабабнех
источник
2

Я искал решение для экспорта столбца IMAGE, в котором хранятся файлы разных типов (pdf, xls, doc, xml ...), которые я хочу экспортировать.

Подход в ответе работал только для PDF-файлов. Чтобы экспортировать все виды файлов, мне пришлось настроить решение следующим образом:

(1.) Создайте файл шаблона формата:

Declare @sql varchar(500); 
Declare @sql varchar(500); 
SET @sql = 'bcp db.dbo.ImgTable format nul -T -n -f C:\tmp\export.fmt -S ' + @@SERVERNAME; 
select @sql;  
EXEC master.dbo.xp_CmdShell @sql; 

(2.) Откройте созданный файл формата экспорта и отредактируйте его следующим образом:

10.0
1
1       SQLIMAGE            0       0       ""   1     img_col                                     ""

Затем выполните команду экспорта:

EXEC master..xp_cmdshell 'BCP "SELECT IMG_COL FROM db.dbo.ImgTable WHERE id = ''CAB240C0-0068-4041-AA34-0000ECB42DDD'' " queryout "C:\tmp\myFile.xml" -T -f C:\tmp\export.fmt -S '

(3.) Если вы столкнулись с этой ошибкой (как я):

«[Microsoft] [Собственный клиент SQL] Столбцы файла хоста могут быть пропущены только при копировании на Сервер»

убедитесь в следующем:

  • убедитесь, что вы не забыли отредактировать вторую строку и введите здесь количество записей (1 в этом сценарии)!
  • убедитесь, что у вас есть CRLF в конце последней строки, без этого он не работал!

После этого выполняется экспорт любого слова из файла IMAGE Column без ошибок.

Дани за 1. и 2. все идет к ответу на следующий вопрос: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947

Magier
источник
1

Если у вас нет проблем с решением с графическим интерфейсом, есть действительно хорошая надстройка для SSMS SSMSBoost, которая предоставляет множество полезных функций и, конечно, самый простой способ предварительного просмотра изображений, хранящихся в SQL (по крайней мере, на мой взгляд)

ПРИМЕЧАНИЕ . После установки этой надстройки необходимо перезапустить SSMS.

Установите его и наслаждайтесь предварительным просмотром изображений только с помощью: RightClick> Visualize As> Picture

ABS
источник
0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

Держите команду на ОДНОЙ ЛИНИИ - ЕДИНАЯ ЛИНИЯ !!!

SET @Command = 'bcp "SELECT Member_Picture FROM dbserver.[Member_Image] WHERE memberId = 1 " queryout "D:\Project\Member\Images\member1.jpg" -T -N ' 
PRINT @Command -- debugging
EXEC xp_cmdshell   @Command
GO
ARYA
источник
На некоторых серверах xp_cmdshell отключен, и вы получаетеSQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
JustAMartin
-2
USE [POC]
DECLARE @outPutPath varchar(50) = 'C:\Extract_Photos'
, @i bigint
, @init int
, @data varbinary(max)
, @fPath varchar(max)
, @folderPath  varchar(max)

--Get Data into temp Table variable so that we can iterate over it
DECLARE @Doctable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

INSERT INTO @Doctable([Doc_Num] , [FileName],[Doc_Content])
Select [STUDENTNO] , [STUDENTNAME],[STUDENTPHOTO] FROM  [dbo].[STUDENTPHOTOS]

--SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT
     @data = [Doc_Content],
     @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
     @folderPath = @outPutPath + '\'+ [Doc_Num]
    FROM @Doctable WHERE id = @i

  --Create folder first
  EXEC  [dbo].[CreateFolder]  @folderPath

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
  EXEC sp_OASetProperty @init, 'Type', 1;
  EXEC sp_OAMethod @init, 'Open'; -- Calling a method
  EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
  EXEC sp_OAMethod @init, 'Close'; -- Calling a method
  EXEC sp_OADestroy @init; -- Closed the resources

  print 'Document Generated at - '+  @fPath

--Reset the variables for next use
SELECT @data = NULL
, @init = NULL
, @fPath = NULL
, @folderPath = NULL
SET @i -= 1
END
erax
источник
Пожалуйста, измените ваш пост, объяснив, что этот код должен делать.
Dezso
Спасибо Erax за сценарий, он работал чудесно. PS: сценарий не может извлечь файл, если запущен удаленно с использованием SSMS. Это должно было быть запущено на SQLServer непосредственно для того, чтобы вытащить вложение.
Ваас