Tôi sẽ di chuyển từ một cơ sở dữ liệu. Có một cột loại image
mà 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?
Tôi sẽ di chuyển từ một cơ sở dữ liệu. Có một cột loại image
mà 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?
Câu trả lời:
Đây là giải pháp tôi đã đưa ra:
Kích hoạt xp_cmdshell
với
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
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'
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]
2B 90 01 00
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.
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:
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
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
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
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.
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