কীভাবে এসকিউএল সার্ভারে একটি চিত্র কলাম রফতানি করতে হবে?


14

আমি একটি ডাটাবেস থেকে স্থানান্তর করব। টাইপের একটি কলাম রয়েছে imageযা আমি ফাইল সিস্টেমে বাইনারি ফাইলগুলিতে রফতানি করতে চাই। প্রতিটি রেকর্ডের জন্য একটি ফাইল। আমি কীভাবে এসকিউএল সার্ভার দিয়ে এটি করতে পারি?


1
আমনা আসিফ একটি ভাল পোস্ট sqlcache.blogspot.com/2014/09/…
aasim.abdullah

উত্তর:


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. ক্যোয়ারআউট সহ বিসিপি ব্যবহার করুন

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** আপনার_ডিবি অবশ্যই পুরোপুরি যোগ্য টেবিলের নাম হতে পারে, [হিওডিবি] [


1
আমি উপরের কোডটি চেষ্টা করেছিলাম এবং এটি সত্যিই কাজ করে ... এক পর্যায়ে। কোনও কারণে জেপিজি চিত্রটিতে 4 টি পূর্ববর্তী অক্ষর রয়েছে যা এটিকে অবৈধ করে তোলে। আমি এগুলি একটি পাঠ্য সম্পাদক এবং ভয়েলা দিয়ে সরিয়েছি ... জেপিজি কাজ করেছিল। এই 4 টি অক্ষর কী হতে পারে এবং রফতানিতে কীভাবে এগুলি থেকে মুক্তি পাবেন তার কোনও ধারণা? তারা 2B 90 01 00

আপনি যে কলামটি থেকে রফতানি করেছেন তা কী ধরণের?
ম্যাক্স ভার্নন

10

আমার সমস্ত ফাইলের শুরুতে অতিরিক্ত 4 বাইট যুক্ত হওয়ার সাথে আমার একই সমস্যা ছিল। আমার বিসিপি কমান্ড -N বিকল্প ব্যবহার করার পরিবর্তে, আমি এটি সি সি র মধ্যে পরিবর্তন করেছি। আপনি যখন এটি করেন, বিসিপি নিম্নলিখিত প্রশ্নগুলির সাথে অনুরোধ জানানো হবে:

ফিল্ড ফাইল ডেটা [চিত্র] এর ফাইল স্টোরেজ প্রকারটি প্রবেশ করান:
ফিল্ড ফাইলের ডেটা উপসর্গ-দৈর্ঘ্য লিখুন [4]:
ফিল্ডডাটা ফাইলের দৈর্ঘ্য লিখুন [0]:
ফিল্ড টার্মিনেটর প্রবেশ করুন [কিছুই নয়]: 
আপনি কি কোনও ফাইলে এই ফর্ম্যাট তথ্য সংরক্ষণ করতে চান? [Y / N]

এটি ঠিক করার জন্য আমি আমার এসকিউএল সার্ভারের মূলটিতে একটি পাঠ্য ফাইল (i.txt) তৈরি করেছি যার মধ্যে প্রতিটিটির উত্তর দেওয়ার জন্য নীচের লাইনগুলি ছিল:

আমি
0
0

এন

তারপরে, আমার এক্সইসিসি বিসিপি লাইনটি হয়ে গেল:

এক্সইসি মাস্টার..এক্সপি_সিএমএসএল 'বিসিপি "কলাম_আপনি_প্রেম নির্বাচন করুন ** আপনার_ডিবি যেখানে আইডি = 1" ক্যোয়ারআউট "সি: \ এক্সপোর্টডির \ yourfile.pdf" -T -C RAW <সি:। I.txt'

এটি কোনও অতিরিক্ত অক্ষর ছাড়াই আমার ফাইলটি রফতানি করেছে।


2

আমি বিভিন্ন ধরণের ফাইল ধরণের (পিডিএফ, এক্সএলএস, ডক, এক্সএমএল ...) রফতানি করতে ইমেজ কলামটি রফতানি করার সমাধান খুঁজছিলাম।

উত্তরের পন্থাটি কেবল পিডিএফ ফাইলের জন্য কাজ করেছিল। সকল ধরণের ফাইল রফতানি করতে আমাকে নীচের মত সমাধানটি সামঞ্জস্য করতে হয়েছিল:

(১) একটি ফর্ম্যাট টেম্পলেট ফাইল তৈরি করুন:

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; 

(২) তৈরি রফতানি বিন্যাস ফাইলটি খুলুন এবং সেভাবে সম্পাদনা করুন:

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 '

(৩.) আপনি যদি এই ত্রুটিটি চালিয়ে যান (যেমন আমি করেছি):

"[মাইক্রোসফ্ট] [এসকিউএল নেটিভ ক্লায়েন্ট] হোস্ট-ফাইল কলামগুলি কেবল সার্ভারে অনুলিপি করার সময় এড়ানো যেতে পারে"

নিম্নলিখিতটি নিশ্চিত করুন:

  • নিশ্চিত হয়ে নিন যে আপনি দ্বিতীয় সারিতে সম্পাদনা করতে এবং এখানে এন্ট্রি সংখ্যা লিখতে ভোলেন নি (এই দৃশ্যে 1)!
  • শেষ লাইনের শেষে আপনার কাছে একটি সিআরএলএফ আছে তা নিশ্চিত করুন, এটি ছাড়া এটি কাজ করে না!

এর পরে, কোনও ত্রুটি ছাড়াই কোনও IMAGE কলাম ফাইল শব্দ রফতানি করে।

1. এবং 2 এর জন্য শ্রদ্ধা নিবেদনগুলি সমস্ত নিম্নলিখিত প্রশ্নের উত্তরের দিকে যায়: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

আপনার যদি জিইউআই সমাধানে কোনও সমস্যা না হয় তবে এসএসএমএস এসএসএমএসবউস্টের জন্য একটি দুর্দান্ত অ্যাড-ইন রয়েছে যা প্রচুর দরকারী বৈশিষ্ট্য সরবরাহ করে এবং অবশ্যই এসকিউএল-এ সঞ্চিত চিত্রগুলির প্রাকদর্শন করার সহজতম উপায় (কমপক্ষে আমার মতে)

দ্রষ্টব্য : এই অ্যাড-ইনটি ইনস্টল করার পরে আপনাকে অবশ্যই এসএসএমএস পুনরায় চালু করতে হবে।

এটি ইনস্টল করুন এবং ঠিক এর সাথে চিত্রগুলির পূর্বরূপ উপভোগ করুন: রাইটক্লিক> ভিজ্যুয়ালাইজ এ> চিত্র


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

কিছু সার্ভারে এক্সপি_সিএমডি শেল অক্ষম করা হয় এবং আপনি পান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.
জাস্টামার্টিন

-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

স্ক্রিপ্টটি দুর্দান্তভাবে কাজ করার জন্য ধন্যবাদ এরাক্স। পিএস: স্ক্রিপ্টটি এসএমএস ব্যবহার করে দূর থেকে চালিত হলে ফাইলটি বের করতে ব্যর্থ হয়। সংযুক্তি টানতে এটি সরাসরি এসকিউএল সার্ভারে চালিত হতে হয়েছিল।
ভাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.