मैं इस प्रश्न का उत्तर दे रहा हूं क्योंकि मुझे इसे तेजी से करने का एक तरीका मिल गया है।
कमांड लाइन से bcp (बल्क कॉपी प्रोग्राम) उपयोगिता का उपयोग करना मूल फ़ाइल स्वरूप को सुरक्षित रखता है और बहुत तेज़ है। आउटपुट फ़ाइलों को स्थानीय निर्देशिका में भी लिखा जा सकता है। साथ ही, यदि आवश्यक हो तो फ़ाइल स्वरूपों को अनुकूलित किया जा सकता है।
संपादित करें:मेरे द्वारा उपयोग किए गए कोड के साथ उत्तर का अधिक विस्तृत संस्करण जोड़ना।
1) xp_cmdshell
execute को निष्पादित करने के लिए आवश्यक अनुमतियां सेट करें ।
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE;
GO
2) bcp
. का उपयोग करके तालिका के लिए प्रारूप फ़ाइल निर्यात करें
bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt
बदलें -T
-S servername -d databasename -U username -P password
. के साथ यदि आप एकीकृत सुरक्षा का उपयोग करके डेटाबेस से कनेक्ट नहीं होते हैं।
3) प्रारूप फ़ाइल के सफल निर्यात के बाद, image
. को छोड़कर अन्य सभी स्तंभों को हटाने के लिए इसे संपादित करें या varbinary
कॉलम।
प्रारूप फ़ाइल शुरू में इस तरह दिखती थी।
11.0
17
1 SQLNCHAR 2 200 "" 1 Name SQL_Latin1_General_CP1_CI_AS
2 SQLNCHAR 2 1000 "" 2 Description SQL_Latin1_General_CP1_CI_AS
3 SQLUNIQUEID 1 16 "" 3 GUID ""
4 SQLBIT 1 1 "" 4 Enabled ""
5 SQLNCHAR 2 600 "" 5 ClassType SQL_Latin1_General_CP1_CI_AS
6 SQLINT 0 4 "" 6 PartitionID ""
7 SQLBIT 1 1 "" 7 Protected ""
8 SQLDATETIME 1 8 "" 8 LastModifiedTime ""
9 SQLINT 0 4 "" 9 LastModifiedByID ""
10 SQLINT 0 4 "" 10 ImageType ""
11 SQLBIT 1 1 "" 11 Template ""
12 SQLINT 0 4 "" 12 ObjectID ""
13 SQLBINARY 8 0 "" 13 Image --column of interest ""
14 SQLINT 0 4 "" 14 ParentId ""
15 SQLNCHAR 2 600 "" 15 ParentClassType SQL_Latin1_General_CP1_CI_AS
16 SQLBIT 1 1 "" 16 IsPrimary ""
17 SQLDATETIME 1 8 "" 17 ImageCaptureDate ""
मैंने फ़ाइल को नीचे की तरह संपादित किया है।
11.0
1
1 SQLBINARY 0 0 "" 1 Image ""
4) फिर मुझे फ़ाइल के रूप में प्रत्येक पंक्ति में छवि कॉलम निकालने के लिए तालिका में पंक्तियों के माध्यम से लूप करना पड़ा। मैंने एक temp table
का उपयोग किया है इस उद्देश्य के लिए।
IF OBJECT_ID('dbo.tmp_for_picture', 'U') IS NOT NULL
DROP TABLE tmp_for_picture
GO
select
row_number() over(order by parentid) as rownum
,i.image as image_column
,i.parentid
,replace(p.name,',','') as picture_file_name
,i.name
into tmp_for_picture
from Images i
join personnel p on p.ObjectID = i.ParentId
GO
declare @cnt int
declare @i int
declare @filename varchar(512)
declare @extension varchar(20)
declare @sql varchar(4000)
set @cnt = (select count(*) from Images i join personnel p on p.ObjectID = i.ParentId)
set @i = 1
set @extension = '.jpeg' --or extract the extension from a column in the table if available
while @i <= @cnt
begin
--print @i
set @filename = (select picture_file_name from tmp_for_picture where rownum = @i)
set @sql = 'bcp "select image_column from tmp_for_picture where rownum = '+str(@i)+'" queryout "F:\pictures\'[email protected][email protected]+'" -f formatfile.fmt -S servername -d databasename -T'
--print @sql
exec xp_cmdshell @sql
set @i = @i+1
end
GO
ऊपर वर्णित चरणों का उपयोग डेटाबेस से किसी भी प्रकार की छवि/varbinary फ़ाइलों (pdf, docx आदि के रूप में संग्रहीत) को निकालने के लिए किया जा सकता है।