मैं एक डेटाबेस से माइग्रेट करूँगा। एक प्रकार का कॉलम है image
जिसे मैं फ़ाइल सिस्टम पर बाइनरी फ़ाइलों को निर्यात करना चाहता हूं। प्रत्येक रिकॉर्ड के लिए एक फ़ाइल। मैं SQL सर्वर के साथ ऐसा कैसे कर सकता हूं?
मैं एक डेटाबेस से माइग्रेट करूँगा। एक प्रकार का कॉलम है image
जिसे मैं फ़ाइल सिस्टम पर बाइनरी फ़ाइलों को निर्यात करना चाहता हूं। प्रत्येक रिकॉर्ड के लिए एक फ़ाइल। मैं SQL सर्वर के साथ ऐसा कैसे कर सकता हूं?
जवाबों:
यह वह उपाय है जो मैं लेकर आया हूं:
के xp_cmdshell
साथ सक्षम करें
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
यदि आवश्यक xp_cmdshell
अनुमतियाँ प्राप्त करने के लिए एक निर्देशिका बनाएं ।
EXEC master..xp_cmdshell 'mkdir C:\exportdir'
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]। [tTUE]
2B 90 01 00
मुझे अतिरिक्त 4 बाइट्स के साथ एक ही समस्या थी मेरी सभी फाइलों की शुरुआत में भी जोड़ा गया था। अपने bcp कमांड में -N विकल्प का उपयोग करने के बजाय, मैंने इसे -C RAW में बदल दिया। जब आप ऐसा करते हैं, तो बीसीपी को निम्नलिखित प्रश्नों के साथ जोड़ा जाएगा:
फ़ाइल का प्रकार दर्ज करें फ़ाइलडेटा फ़ाइल का प्रकार: फ़ील्ड की पूर्व-लंबाई दर्ज करें FileData [4]: फ़ील्ड की लंबाई दर्ज करें FileData [0]: फ़ील्ड टर्मिनेटर डालें [कोई नहीं]: क्या आप फ़ाइल में इस प्रारूप जानकारी को सहेजना चाहते हैं? [Y n]
इसे ठीक करने के लिए मैंने अपने sql सर्वर के मूल में एक टेक्स्ट फ़ाइल (i.txt) बनाई, जिसमें इनमें से प्रत्येक का उत्तर देने के लिए निम्नलिखित पंक्तियाँ थीं:
मैं 0 0 n
फिर, मेरी EXEC bcp लाइन बन गई:
EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1" quotout "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'
इसने बिना किसी अतिरिक्त वर्ण के मेरी फ़ाइल निर्यात की।
मैं एक IMAGE कॉलम के निर्यात के लिए एक समाधान की तलाश में आया था, जिसमें विभिन्न प्रकार की फ़ाइल प्रकारों (पीडीएफ, xls, डॉक्टर, xml ...) को निर्यात करना था।
उत्तर में दृष्टिकोण केवल पीडीएफ फाइलों के लिए काम किया। सभी प्रकार की फ़ाइलों को निर्यात करने के लिए मुझे समाधान को निम्नानुसार बदलना पड़ा:
(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 मूल ग्राहक] होस्ट-फ़ाइल कॉलम केवल सर्वर में कॉपी करते समय छोड़ दिया जा सकता है"
निम्नलिखित सुनिश्चित करें:
इसके बाद, बिना किसी त्रुटि के किसी भी IMAGE कॉलम फ़ाइल शब्द का निर्यात।
1 और 2 के लिए श्रद्धांजलि। सभी निम्नलिखित प्रश्न के उत्तर में जाते हैं: /programming/1366544/how-to-export-image-field-to-file/24006947#2400447
यदि आपको GUI समाधान के साथ कोई समस्या नहीं है, तो SSMS SSMSBoost के लिए वास्तव में बहुत अच्छा ऐड-इन है जो बहुत सारी उपयोगी सुविधाएँ प्रदान करता है, और निश्चित रूप से SQL में संग्रहीत छवियों का पूर्वावलोकन करने का सबसे सरल तरीका (कम से कम मेरी राय में)
नोट : इस ऐड-इन को स्थापित करने के बाद आपको SSMS को पुनरारंभ करना होगा।
इसे स्थापित करें और पूर्वावलोकन छवियों का आनंद लें: RightClick> Asize चित्र
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.
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