Bagaimana cara mengekspor kolom gambar ke file di SQL Server?

Jawaban:

13

Ini adalah solusi yang saya buat:

  1. Aktifkan xp_cmdshelldengan

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. Jika perlu buat direktori dengan xp_cmdshelluntuk mendapatkan izin yang dibutuhkan.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Gunakan BCP dengan kueri

    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 harus nama tabel yang sepenuhnya memenuhi syarat, yaitu [Yourdb]. [YourSchema]. [YourTable]

Jonas
sumber
1
Saya mencoba kode di atas dan itu memang berhasil ... to the point. Untuk beberapa alasan gambar JPG memiliki 4 karakter sebelumnya yang menyebabkannya menjadi tidak valid. Saya menghapus ini dengan editor teks dan voila ... JPG bekerja. Adakah yang tahu apa 4 karakter ini dan bagaimana cara menghilangkannya dalam ekspor? Mereka adalah:2B 90 01 00
Dari jenis kolom mana Anda mengekspor?
Max Vernon
10

Saya memiliki masalah yang sama dengan tambahan 4 byte yang ditambahkan ke awal semua file saya juga. Alih-alih menggunakan opsi -N dalam perintah bcp saya, saya mengubahnya ke -C RAW. Ketika Anda melakukan ini, bcp akan diminta dengan pertanyaan berikut:

Masukkan jenis penyimpanan file pada bidang FileData [gambar]:
Masukkan awalan panjang field FileData [4]:
Masukkan panjang bidang FileData [0]:
Masukkan terminator bidang [tidak ada]: 
Apakah Anda ingin menyimpan informasi format ini dalam file? [Y / n]

Untuk memperbaikinya, saya membuat file teks (i.txt) di root server sql saya yang memiliki baris berikut di dalamnya untuk menjawab masing-masing:

saya
0
0

n

Kemudian, baris bcp EXEC saya menjadi:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image DARI ** your_db WHERE id = 1" queryout "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'

Ini mengekspor file saya tanpa ada karakter tambahan.

Yakub Dababneh
sumber
2

Saya datang mencari solusi untuk mengekspor Kolom IMAGE setelah menyimpan berbagai jenis file (pdf, xls, doc, xml ...) Saya ingin mengekspor.

Pendekatan dalam jawaban hanya berfungsi untuk file pdf. Untuk mengekspor semua jenis file, saya harus menyesuaikan solusinya sebagai berikut:

(1.) Buat file templat format:

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.) Buka file format ekspor yang dibuat dan edit seperti itu:

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

Kemudian jalankan perintah ekspor Anda:

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.) Jika Anda mengalami kesalahan ini (seperti yang saya lakukan):

"[Microsoft] [SQL Native Client] kolom file host hanya dapat dilewati saat menyalin ke Server"

pastikan yang berikut ini:

  • pastikan Anda tidak lupa mengedit baris kedua dan memasukkan jumlah entri di sini (1 dalam skenario ini)!
  • pastikan Anda memiliki CRLF di akhir baris terakhir, tanpa ini tidak berfungsi!

Setelah ini, ekspor kata file Kolom IMAGE apa pun tanpa kesalahan.

Tribut untuk 1. dan 2. semua menuju ke jawaban dari pertanyaan berikut: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947

Magier
sumber
1

Jika Anda tidak memiliki masalah dengan solusi GUI, ada tambahan yang sangat bagus untuk SSMS SSMSBoost yang menyediakan banyak fitur berguna, dan tentu saja cara paling sederhana untuk melihat pratinjau gambar yang disimpan dalam SQL (setidaknya menurut saya)

CATATAN : Anda harus memulai ulang SSMS setelah menginstal add-in ini.

Instal dan nikmati pratinjau gambar hanya dengan: Klik kanan> Visualisasikan Sebagai> Gambar

ABS
sumber
0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

Jaga perintah pada SATU LINE - SINGLE LINE !!!

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
sumber
Pada beberapa server xp_cmdshell dinonaktifkan dan Anda mendapatkanSQL 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
sumber
Harap ubah posting Anda dengan menjelaskan apa yang seharusnya dilakukan oleh kode ini.
dezso
Terima kasih Erax untuk skrip ini bekerja dengan sangat baik. PS: Script gagal mengekstrak file jika dijalankan dari jarak jauh menggunakan SSMS. Itu harus dijalankan pada SQLServer secara langsung untuk menarik lampiran.
Vaas