Làm cách nào để xuất một cột hình ảnh thành các tệp trong SQL Server?


13

Tôi sẽ di chuyển từ một cơ sở dữ liệu. Có một cột loại imagemà tôi muốn xuất thành tệp nhị phân trên hệ thống tệp. Một tập tin cho mỗi hồ sơ. Làm thế nào tôi có thể làm điều này với SQL Server?


1
Một bài viết hay của Amna Asif sqlcache.blogspot.com/2014/09/ Kẻ
aasim.abdullah

1
Có lẽ tôi đã đánh sập một cơ sở dữ liệu SSIS đơn giản với Chuyển đổi cột xuất khẩu
Martin Smith

Câu trả lời:


13

Đây là giải pháp tôi đã đưa ra:

  1. Kích hoạt xp_cmdshellvới

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. Nếu cần, tạo một thư mục với xp_cmdshellđể có được các quyền cần thiết.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Sử dụng BCP với truy vấn

    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 phải là tên bảng đủ điều kiện, nghĩa là [Yourdb]. [YourSchema]. [YourTable]


1
Tôi đã thử đoạn mã trên và nó thực sự hoạt động ... đến một điểm. Vì một số lý do, hình ảnh JPG có 4 ký tự trước khiến nó trở nên không hợp lệ. Tôi đã xóa những thứ này bằng trình soạn thảo văn bản và voila ... JPG đã hoạt động. Có ai biết 4 nhân vật này có thể là gì và làm thế nào để loại bỏ chúng trong xuất khẩu không? Họ là:2B 90 01 00

Loại cột bạn đã xuất khẩu là gì?
Max Vernon

10

Tôi cũng gặp vấn đề tương tự với 4 byte bổ sung được thêm vào phần đầu của tất cả các tệp của tôi. Thay vì sử dụng tùy chọn -N trong lệnh bcp của tôi, tôi đã thay đổi nó thành -C RAW. Khi bạn làm điều này, bcp sẽ được nhắc với các câu hỏi sau:

Nhập loại lưu trữ tệp của trường FileData [hình ảnh]:
Nhập độ dài tiền tố của trường FileData [4]:
Nhập độ dài của trường FileData [0]:
Nhập dấu chấm hết trường [none]: 
Bạn có muốn lưu thông tin định dạng này trong một tập tin? [Y / n]

Để khắc phục điều này, tôi đã tạo một tệp văn bản (i.txt) trên thư mục gốc của máy chủ sql của tôi có các dòng sau trong đó để trả lời từng tệp sau:

Tôi
0
0

n

Sau đó, dòng bcp EXEC của tôi đã trở thành:

EXEC master..xp_cmdshell 'BCP "CHỌN cột_of_type_image TỪ ** your_db WHERE id = 1" queryout "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'

Điều này xuất tệp của tôi mà không có bất kỳ ký tự thêm.


2

Tôi đã tìm kiếm một giải pháp để xuất một cột IMAGE đã lưu trữ các loại tệp khác nhau (pdf, xls, doc, xml ...) Tôi muốn xuất.

Cách tiếp cận trong câu trả lời chỉ làm việc cho các tệp pdf. Để xuất tất cả các loại tệp, tôi phải điều chỉnh giải pháp như sau:

(1.) Tạo tệp mẫu định dạng:

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.) Mở tệp định dạng xuất đã tạo và chỉnh sửa theo cách đó:

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

Sau đó thực hiện lệnh xuất của bạn:

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.) Trong trường hợp bạn gặp phải lỗi này (như tôi đã làm):

"[Microsoft] [SQL Native Client] Chỉ có thể bỏ qua các cột tệp máy chủ khi sao chép vào Máy chủ"

đảm bảo những điều sau:

  • đảm bảo bạn không quên chỉnh sửa hàng thứ hai và nhập số lượng mục vào đây (1 trong kịch bản này)!
  • đảm bảo bạn có CRLF ở cuối dòng cuối cùng, nếu không có nó thì nó không hoạt động!

Sau này, việc xuất bất kỳ từ tệp IMAGE Cột nào mà không gặp lỗi.

Tribute cho 1. và 2. tất cả đi đến câu trả lời của câu hỏi sau: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

Nếu bạn không gặp vấn đề gì với giải pháp GUI, thì có một bổ trợ thực sự tuyệt vời cho SSMS SSMSBoost cung cấp nhiều tính năng hữu ích và dĩ nhiên là cách đơn giản nhất để xem trước hình ảnh được lưu trữ trong SQL (ít nhất là theo ý kiến ​​của tôi)

GHI CHÚ : Bạn phải khởi động lại SSMS sau khi cài đặt bổ trợ này.

Cài đặt nó và thưởng thức xem trước hình ảnh chỉ với: RightClick> Visualize As> Picture


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

Giữ lệnh trên MỘT 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

Trên một số máy chủ, xp_cmdshell bị vô hiệu hóa và bạn nhận đượcSQL 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

Vui lòng sửa đổi bài viết của bạn bằng cách giải thích những gì mã này phải làm.
dezso

Cảm ơn Erax cho kịch bản nó đã làm việc tuyệt vời. PS: Tập lệnh không giải nén được tập tin nếu chạy từ xa bằng SSMS. Nó phải được chạy trực tiếp trên SQLServer để kéo tệp đính kèm.
Vaas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.