Як експортувати стовпчик зображень у файли на SQL Server?


14

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


1
Хороший пост від Amna
aasim.abdullah

1
Я, мабуть, збив простий потік даних SSIS з Трансформацією стовпців експорту
Мартін Сміт

Відповіді:


14

Це рішення, яке я придумав:

  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]


1
Я спробував вищевказаний код, і він справді спрацював ... до точки. Чомусь у зображенні JPG є 4 попередніх символи, через які він стає недійсним. Я видалив їх за допомогою текстового редактора та вуаля ... JPG працював. Будь-яка ідея, якими можуть бути ці 4 символи та як їх позбутися при експорті? Це:2B 90 01 00

Який тип стовпця, з якого ви експортували?
Макс Вернон

10

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

Введіть тип файлу зберігання поля FileData [image]:
Введіть префікс-довжину поля FileData [4]:
Введіть довжину поля FileData [0]:
Введіть термінатор поля [немає]: 
Ви хочете зберегти інформацію про цей формат у файлі? [Y / n]

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

Я
0
0

н

Потім мій рядок bcp EXEC став:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1" queryout "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 Native Client] Стовпці файлів хост-файлів можуть пропускатися лише при копіюванні на Сервер"

переконайтесь у наступному:

  • переконайтеся, що ви не забули відредагувати другий рядок і введіть тут кількість записів (1 у цьому сценарії)!
  • переконайтеся, що у вас є CRLF в кінці останнього рядка, без цього не вийшло!

Після цього експорт будь-якого слова файлу стовпця IMAGE без помилок.

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


1

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

ПРИМІТКА. Після установки цього додатка потрібно перезапустити SSMS.

Встановіть його та насолоджуйтесь попереднім переглядом зображень лише за допомогою: Клацніть правою кнопкою миші> Візуалізувати як> Зображення


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

На деяких серверах 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

Будь ласка, внесіть зміни до своєї публікації, пояснивши, що має робити цей код.
dezso

Спасибі Erax за сценарій, він працював чудово. PS: Сценарій не може витягнути файл, якщо він запускається віддалено за допомогою SSMS. Його потрібно було запустити на SQLServer безпосередньо для того, щоб витягнути вкладення.
Ваас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.