SQL Server'daki dosyalara görüntü sütunu nasıl verilir?


Yanıtlar:


14

Bu benim geldiğim çözüm:

  1. etkinleştirme xp_cmdshellile

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
    
  2. Gerekirse xp_cmdshell, gerekli izinleri almak için bir dizin oluşturun .

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Sorgulama ile BCP kullanma

    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'niz tam olarak nitelenmiş tablo adı olmalıdır, yani [Yourdb]. [YourSchema]. [YourTable]


1
Yukarıdaki kodu denedim ve gerçekten işe yaradı ... bir noktaya kadar. Bir nedenden dolayı JPG görüntüsünün geçersiz olmasına neden olan 4 önceki karakteri vardır. Bunları bir metin editörü ile kaldırdım ve işte ... JPG çalıştı. Bu 4 karakterin ne olabileceği ve ihracatta onlardan nasıl kurtulacağı hakkında herhangi bir fikir? Bunlar:2B 90 01 00

Dışa aktardığınız sütunun türü nedir?
Max Vernon

10

Ben de tüm dosyalarımın başına eklenmesi ekstra 4 bayt ile aynı sorunu vardı. Bcp komutumda -N seçeneğini kullanmak yerine, -C RAW olarak değiştirdim. Bunu yaptığınızda, bcp'ye aşağıdaki sorular sorulacaktır:

FileData [image] alanının dosya depolama türünü girin:
FileData [4] alanının önek uzunluğunu girin:
FileData [0] alanının uzunluğunu girin:
Alan sonlandırıcısını girin [yok]: 
Bu biçim bilgilerini bir dosyaya kaydetmek istiyor musunuz? [E / N]

Bunu düzeltmek için, sql sunucumun kökünde, her birine cevap vermek için aşağıdaki satırları içeren bir metin dosyası (i.txt) oluşturdum:

ben
0
0

n

Sonra, EXEC BCP hattım oldu:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db NEREDE kimlik = 1" sorgulama "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'

Bu, herhangi bir ekstra karakter olmadan dosyamı dışa aktardı.


2

Dışa aktarmak istediğim dosya türlerini (pdf, xls, doc, xml ...) saklayan bir IMAGE Sütunu vermek için bir çözüm aramaya geldim.

Yanıttaki yaklaşım sadece pdf dosyaları için işe yaradı. Her türlü dosyayı dışa aktarmak için çözümü aşağıdaki gibi ayarlamam gerekiyordu:

(1.) Bir format şablonu dosyası oluşturun:

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.) Oluşturulan dışa aktarma formatı dosyasını açın ve şu şekilde düzenleyin:

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

Ardından dışa aktarma komutunuzu yürütü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.) Bu hatayla karşılaşmanız durumunda (yaptığım gibi):

"[Microsoft] [SQL Yerel İstemci] Ana makine dosyası sütunları yalnızca Sunucuya kopyalanırken atlanabilir"

aşağıdakilerden emin olun:

  • ikinci satırı düzenlemeyi unutmadığınızdan emin olun ve giriş sayısını buraya girin (bu senaryoda 1)!
  • son satırın sonunda bir CRLF olduğundan emin olun, bu olmadan işe yaramadı!

Bundan sonra, herhangi bir IMAGE Sütun dosyası kelimesinin hatasız olarak dışa aktarılması.

1. ve 2. övgüler hepsi şu sorunun cevabına gider: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

Bir GUI çözümü ile ilgili herhangi bir sorununuz yoksa, SSMS SSMSBoost için gerçekten harika bir eklenti vardır ve bu da birçok yararlı özellik sağlar ve elbette SQL'de saklanan görüntüleri önizlemenin en basit yolu (en azından benim görüşüme göre)

NOT : Bu eklentiyi yükledikten sonra SSMS'yi yeniden başlatmanız gerekir.

Yükleyin ve sadece şununla önizlemenin keyfini çıkarın: RightClick> Farklı Görselleştir> Resim


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

TEK HAT - TEK HATTI komutunu saklayın !!!

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

Bazı sunucularda xp_cmdshell devre dışı bırakılır ve elde edersinizSQL 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

Lütfen bu kodun ne yapması gerektiğini açıklayarak yayınınızı değiştirin.
dezso

Harika çalıştı senaryo için teşekkürler Erax. PS: Komut dosyası, SSMS kullanılarak uzaktan çalıştırılırsa dosyayı ayıklayamaz. Eki çekmek için SQLServer üzerinde doğrudan çalıştırılması gerekiyordu.
Vaas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.