จะส่งออกคอลัมน์ภาพเป็นไฟล์ใน SQL Server ได้อย่างไร


14

ฉันจะย้ายจากฐานข้อมูล มีหนึ่งประเภทคอลัมน์imageที่ฉันต้องการส่งออกไปยังไฟล์ไบนารีบนระบบไฟล์ หนึ่งไฟล์สำหรับแต่ละระเบียน ฉันจะทำสิ่งนี้กับ SQL Server ได้อย่างไร


1
โพสต์ที่ดีโดย Amna Asif sqlcache.blogspot.com/2014/09/…
aasim.abdullah

1
ฉันอาจจะล้มเหลวข้อมูล SSIS แบบง่ายๆด้วยการแปลงคอลัมน์ส่งออก
Martin Smith

คำตอบ:


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 ตัวซึ่งทำให้ไม่สามารถใช้งานได้ ฉันลบสิ่งเหล่านี้ด้วยโปรแกรมแก้ไขข้อความและ voila ... JPG ทำงาน มีความคิดอะไรบ้างที่ตัวละครทั้ง 4 ตัวนี้จะเป็นอย่างไรและจะกำจัดมันในการส่งออกได้อย่างไร? พวกเขาคือ:2B 90 01 00

คอลัมน์ที่คุณส่งออกเป็นประเภทใด
Max Vernon

10

ฉันมีปัญหาเดียวกันกับ 4 ไบต์พิเศษที่เพิ่มเข้ามาในตอนต้นของไฟล์ทั้งหมดของฉันเช่นกัน แทนที่จะใช้ตัวเลือก -N ในคำสั่ง bcp ของฉันฉันเปลี่ยนเป็น -C RAW เมื่อคุณทำเช่นนี้ bcp จะถูกถามพร้อมกับคำถามต่อไปนี้:

ป้อนประเภทที่เก็บไฟล์ของฟิลด์ FileData [ภาพ]:
ป้อนคำนำหน้าความยาวของฟิลด์ FileData [4]:
ป้อนความยาวของฟิลด์ FileData [0]:
ป้อนตัวยุติฟิลด์ [none]: 
คุณต้องการบันทึกข้อมูลรูปแบบนี้ในไฟล์หรือไม่? [Y / N]

ในการแก้ไขปัญหานี้ฉันได้สร้างไฟล์ข้อความ (i.txt) บนรูทของเซิร์ฟเวอร์ sql ของฉันซึ่งมีบรรทัดต่อไปนี้อยู่ภายในเพื่อตอบแต่ละข้อเหล่านี้:

ผม
0
0

n

จากนั้นบรรทัด bcp ของ EXEC ของฉันกลายเป็น:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image จาก ** 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 Native Client] คอลัมน์โฮสต์ไฟล์อาจถูกข้ามเมื่อคัดลอกไปยังเซิร์ฟเวอร์"

ตรวจสอบให้แน่ใจดังต่อไปนี้:

  • ตรวจสอบให้แน่ใจว่าคุณไม่ลืมที่จะแก้ไขแถวที่สองและป้อนจำนวนรายการที่นี่ (1 ในสถานการณ์นี้)!
  • ตรวจสอบให้แน่ใจว่าคุณมี CRLF ในตอนท้ายของบรรทัดสุดท้ายหากไม่มีสิ่งนี้มันก็ไม่ทำงาน!

หลังจากนี้การส่งออกคำไฟล์คอลัมน์ IMAGE ใด ๆ โดยไม่มีข้อผิดพลาด

บรรณาการสำหรับ 1 และ 2 ทั้งหมดไปที่คำตอบของคำถามต่อไปนี้: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

หากคุณไม่มีปัญหาใด ๆ กับโซลูชัน GUI มี add-in ที่ยอดเยี่ยมสำหรับ SSMS SSMSBoostซึ่งมีคุณสมบัติที่มีประโยชน์มากมายและแน่นอนวิธีที่ง่ายที่สุดในการดูตัวอย่างรูปภาพที่เก็บไว้ใน SQL (อย่างน้อยก็ในความคิดของฉัน)

หมายเหตุ : คุณต้องรีสตาร์ท SSMS หลังจากติดตั้ง Add-in นี้

ติดตั้งและสนุกกับการดูตัวอย่างภาพด้วย: คลิกขวา> แสดงภาพเป็น> ภาพ


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 โดยตรงเพื่อดึงสิ่งที่แนบมา
Vaas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.