Database
 sql >> डेटाबेस >  >> RDS >> Database

बीसीपी उपयोगिता के साथ फ्लैट फ़ाइल में डेटा कैसे निर्यात करें और बल्क इंसर्ट के साथ डेटा आयात करें

SQL सर्वर में BCP (बल्क कॉपी प्रोग्राम) उपयोगिता डेटाबेस व्यवस्थापकों को तालिका में डेटा आयात करने और तालिका से डेटा को फ़्लैट फ़ाइल में निर्यात करने की अनुमति देती है। बीसीपी उपयोगिता विभिन्न सुविधाओं का भी समर्थन करती है जो थोक डेटा के निर्यात और आयात की प्रक्रिया को सुविधाजनक बनाती हैं।

अब एक व्यावसायिक परिदृश्य के साथ आरंभ करते हैं।

व्यावसायिक परिदृश्य

मान लीजिए, हमें एसएफटीएस जैसे सुरक्षित साझा स्थान में क्लाइंट को विशिष्ट प्रारूप में मासिक रिपोर्ट साझा करने की आवश्यकता है, यानी हर महीने की शुरुआत में, हमें पिछले महीने के लिए क्लाइंट को फाइल भेजने की आवश्यकता होती है। इस परिदृश्य में, हम डेटा उत्पन्न करने के लिए संग्रहीत कार्यविधि बनाने और उस डेटा को फ़्लैट फ़ाइल (.txt या .csv) में निर्यात करने का प्रयास करेंगे।

SQL डेटा को आयात और निर्यात कैसे करें?

ऐसा करने के कई तरीके हैं:

  • SSMS का उपयोग करके, क्वेरी विंडो में क्वेरी चलाएँ और निर्यात या SQL सर्वर आयात और निर्यात विज़ार्ड।
  • एसएसआईएस का उपयोग करना - एसएसडीटी का उपयोग करके एक पैकेज बनाना।
  • SSRS का उपयोग करना।
  • C# का उपयोग करना - कंसोल बनाएं या निर्यात करने के लिए एप्लिकेशन जीतें।
  • बीसीपी उपयोगिता।
  • आदि.

BCP यूटिलिटी क्या है?

BCP (बल्क कॉपी प्रोग्राम) उपयोगिता MS SQL सर्वर की आवृत्ति और उपयोगकर्ता द्वारा निर्दिष्ट प्रारूप में डेटा फ़ाइल के बीच डेटा की प्रतिलिपि बनाने के लिए एक कमांड-लाइन उपयोगिता है। हम SQL सर्वर डेटाबेस में बड़ी मात्रा में डेटा को जल्दी और आसानी से निर्यात और आयात कर सकते हैं।

BCP उपयोगिता निम्नलिखित कार्य करती है:

  • SQL सर्वर तालिका से डेटा फ़ाइल में बल्क डेटा निर्यात।
  • एक क्वेरी/संग्रहीत प्रक्रिया से थोक डेटा निर्यात।
  • डेटा फ़ाइल से SQL सर्वर तालिका में बल्क डेटा आयात।
  • प्रारूप फ़ाइलों का निर्माण।

आप यहां बीसीपी उपयोगिता के बारे में अधिक विवरण प्राप्त कर सकते हैं।

प्रयुक्त पर्यावरण

  • एसक्यूएल सर्वर 2017 डेवलपर संस्करण
  • एसक्यूएल सर्वर 2017 प्रबंधन स्टूडियो
  • व्यापक विश्व आयातकों का नमूना डेटाबेस v1.0
  • बीसीपी उपयोगिता

एक फ्लैट फ़ाइल में डेटा कैसे निर्यात करें

मासिक रिपोर्ट डेटा जेनरेट करने के लिए एक संग्रहित प्रक्रिया बनाएं।

सबसे पहले, निर्यात संग्रहीत प्रक्रिया के लिए निर्भर ऑब्जेक्ट बनाएं।

तो हमें निम्नलिखित तालिकाएँ बनानी होंगी:

  • आदेश_मासिक_Temp_Table तालिका:इस अस्थायी तालिका का उपयोग मासिक ऑर्डर डेटा को टेक्स्ट फ़ाइल में निर्यात करने के लिए एक विशिष्ट प्रारूप में संग्रहीत करने के लिए किया जाता है यानी हमारे मामले में सभी कॉलम को एक पंक्ति में डेलीमीटर "|" के साथ जोड़ना।
  • Export_Config तालिका:इस तालिका का उपयोग निर्यात कॉन्फ़िगरेशन यानी साझा फ़ोल्डर पथ, फ्लैट फ़ाइल प्रकार, सीमांकक को संग्रहीत करने के लिए किया जाता है।

आदेश_मासिक_Temp_Table के लिए एक स्क्रिप्ट बनाएं

टेबल बनाएं [डीबीओ]। 

Export_Config के लिए एक स्क्रिप्ट बनाएं

टेबल बनाएं [डीबीओ]। न्यूल, [सीमांकक] [चार] (1) न्यूल नहीं, सीमित [पीके_एक्सपोर्ट_कॉन्फिग] प्राथमिक कुंजी क्लस्टर ([एक्सप_आईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =ऑफ, ALLOW_ONROW_LOCKS =ALLOW_ONROW_LOCKS) [USERDATA]) पर [USERDATA]GO

Export_Config में डेटा डालें

सेट IDENTITY_INSERT [dbo]। ऑर्डरमाथली', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo]।[Export_Config] OFFGO

संग्रहीत प्रक्रिया निर्माण और पैरामीटर

  • यहां साल और महीने के पैरामीटर वैकल्पिक हैं।
  • यदि कोई महीना निर्दिष्ट नहीं है तो पिछला महीना लग जाता है और यदि महीना 12 है तो हमें पिछला वर्ष लेना होगा, क्योंकि अगर हम दिसंबर 2018 के लिए जनवरी 2019 में रिपोर्ट तैयार कर रहे हैं।
  • यदि कोई वर्ष निर्दिष्ट नहीं है, तो वह चालू वर्ष लेता है और फ़ोल्डर पथ अनिवार्य है।
CREATE PROCEDURE [dbo]। कोशिश करना शुरू करें

पैरामीटर सत्यापन

--#region Parametes सत्यापन यदि NULLIF(@Month, '') IS NULL BEGIN SELECT @Month =DATEPART(mm, DATEADD(month, - 1, GETDATE())) IF (@Month =12) - BEGIN चुनें @Year =DATEPART (वर्ष, GETDATE ()) - 1 अंत अंत यदि NULLIF (@Year, '') पूर्ण शुरुआत है @Year =DATEPART (वर्ष, GETDATE ()) का चयन करें यदि NULLIF (@FolderPath, '') IS NULL BEGIN --SELECT @FolderPath ='\\AASHREEPC\FileServer' चुनें 'ERROR FolderPath निर्दिष्ट किया जाना चाहिए।' वापसी; END --#endregion पैरामीटर सत्यापन

निर्यात तालिका से कॉन्फ़िगरेशन प्राप्त करें

DECLARE @ExportPath VARCHAR(200),@Delimiter CHAR(1),@FileType VARCHAR(5) सेलेक्ट @ExportPath =TRIM(ShareFolder),@FileType =TRIM(FileType),@Delimiter =TRIM(Delimiter) FROM dbo .Export_Config

माह की आरंभ तिथि और समाप्ति तिथि प्राप्त करना

घोषणा @MonthStartDate DATETIME =DATEADD(माह, @Month-1, DATEADD(वर्ष, @Year - 1900, 0)),@MonthEndDate DATETIME =DATEADD(दिन, - 1, DATEADD(माह, @Month, DATEADD) वर्ष, @ वर्ष - 1900, 0))) रिपोर्ट डेटा/परिणाम के लिए अस्थायी तालिका जांचें और बनाएं यदि मौजूद नहीं है (चुनें * sys.objects से जहां object_id =OBJECT_ID(N'[dbo].[Orders_Monthly_Temp_Table]') और टाइप करें IN (N'U') ) टेबल बनाना शुरू करें [dbo].Orders_Monthly_Temp_Table ([Row] [varchar](200) NOT NULL) ऑन [प्राथमिक] END

विशिष्ट प्रारूप में डेटा को अस्थायी तालिका में सम्मिलित करें अर्थात इस मामले में "| - पाइप का प्रतीक अलग किया गया"

TRUNCATE TABLE Orders_Monthly_Temp_TableInSERT INTO Orders_Monthly_Temp_Table Select CAST([OrderID] AS VARCHAR(10)) + ' | ' + कास्ट (सी। [ग्राहक नाम] वचर (50) के रूप में) + ' | ' + कास्ट (पी। [पूरा नाम] वचर (50) के रूप में) + ' | ' + ISNULL (कास्ट ([PickedByPersonID] AS VARCHAR (4)), '') + ' | ' + कास्ट (पी। [पूरा नाम] वचर (20) के रूप में) + ' | ' + ISNULL (कास्ट ([बैकऑर्डर ऑर्डर आईडी] वर्चर (4) के रूप में), '') +' | ' + कास्ट ([आदेश दिनांक] वचर (20) के रूप में) + ' | ' + कास्ट ([अपेक्षित डिलीवरी की तारीख] वचर (20) के रूप में) + ' | ' + CAST([CustomerPurchaseOrderNumber] AS VARCHAR(10)) + ' | ' + CAST([IsUndersupplyBackordered] AS VARCHAR(4)) + ' | ' + ISNULL (कास्ट ([टिप्पणियां] वचर (50) के रूप में), '') + ' | ' + ISNULL (कास्ट ([डिलीवरी निर्देश] वचर (50) के रूप में), '') +' | ' + ISNULL (कास्ट ([आंतरिक टिप्पणियां] वचर (50) के रूप में), '') + ' | ' + कास्ट ([चुनना पूरा हो गया है] वचर (20) के रूप में) + ' | ' + CAST(o.[LastEditedBy] AS VARCHAR(4)) + ' | ' + CAST([LastEditedwhen] AS VARCHAR(20)) अस रो फ्रॉम [वाइडवर्ल्ड इम्पोर्टर्स]। इनर जॉइन [एप्लिकेशन]। [लोग] पी ऑन ओ। [सेल्सपर्सन आईडी] =पी। [पर्सनआईडी] जहां ऑर्डरडेट @MonthStartDate और @MonthEndDate के बीच है

एक फ्लैट फ़ाइल में डेटा निर्यात करने के लिए कोड

यदि मौजूद नहीं है तो SQL xp_create_subdir का उपयोग करके फ़ोल्डर बनाएं

DECLARE @sql VARCHAR(8000),@FilePath VARCHAR(200),@Query VARCHAR(100) DECLARE @file_results TABLE (file_exists INT, file_is_a_directory INT,parent_directory_exists INT) SET @FolderPath =@FolderPath + '\' (@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' INSERT INTO @file_results EXEC MASTER.dbo.xp_fileexist @FolderPath यदि मौजूद नहीं है (जहां @file_results से 1 चुनें) file_is_a_directory =1) EXEC MASTER.dbo.xp_create_subdir @FolderPath

साझा फ़ोल्डर में फ़ाइल बनाना

SET @FilePath ='"' + @FolderPath + '' + 'Orders_Monthly' + '_' + (Select Format(GETDATE(), N'yyyMMddHHmmss') ) + '.txt"' SET @Query =' "चयन * से '+ (चयन DB_NAME ()) + '.dbo.Orders_Monthly_Temp_Table"' DECLARE @ exe_path10 VARCHAR (200) ='cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130 &' SELECT @ sql =@ exe_path10 + ' bcp.exe ' + @Query + 'क्वेरीआउट' + @FilePath + '-T -c -q -t0x7c -r\n' --+ @@ सर्वरनाम EXEC मास्टर..xp_cmdshell @sql END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_STATE() AS ErrorState, ERROR_SEVERITY() AS ErrorSeverity, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; END CATCH NOCOUNT OFF;END

अपनी निर्देशिका संदर्भ को उस फ़ोल्डर में बदलें जहां BPC उपयोगिता स्थित है

[टेबल आईडी=58 /]

प्रक्रिया निष्पादित करना

DECLARE @return_value intEXEC @return_value =[dbo]।[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLSELECT 'रिटर्न वैल्यू' =@return_valueGO

आउटपुट

गंतव्य फ़ोल्डर

वास्तविक फ़्लैट फ़ाइल (.txt/.cvs)

साझा फ़ोल्डर में वर्चुअल खाते "NT SERVICE\MSSQLSERVER" के लिए अनुमतियां होनी चाहिए

उस फ़ाइल या फ़ोल्डर पर राइट-क्लिक करें जिसे आप अनुमतियाँ सेट करना चाहते हैं → गुण क्लिक करें → सुरक्षा टैब पर क्लिक करें। → संपादित करें पर क्लिक करें → जोड़ें पर क्लिक करें → ऑब्जेक्ट नाम बॉक्स में NT SERVICE\MSSQLSERVER टाइप करें। ("नाम जांचें" पर क्लिक न करें - यदि आप चेक नामों पर क्लिक करते हैं तो ऐसा हो सकता है कि आपको एक त्रुटि मिलती है "एनटी सेवा \ MSSQLSERVER" नामक एक वस्तु नहीं मिल सकती है।) → ठीक क्लिक करें → MSSQLSERVER खाता चुनें → अनुमतियाँ जोड़ें ( पूर्ण नियंत्रण) जो MSSQLSERVER खाते के लिए आवश्यक हैं:

'xp_cmdshell' SQL सर्वर सक्षम करें

EXEC sp_configure 'उन्नत विकल्प दिखाएं', 1GORECONFIGUREGOEXEC sp_configure 'xp_cmdshell', 1GORECONFIGUREGO

फ्लैट फ़ाइल से डेटा कैसे आयात करें

इस उदाहरण में, हम फ़ाइल से डेटा आयात करने के लिए बल्क इंसर्ट का उपयोग कर रहे हैं। हम Openrowset आदि का भी उपयोग कर सकते हैं।

साझा फ़ोल्डर में एक फ्लैट फ़ाइल से डेटा आयात करने के लिए एक संग्रहीत कार्यविधि बनाएँ।

सबसे पहले, आयात संग्रहीत प्रक्रिया के लिए आश्रित ऑब्जेक्ट बनाएं।

इसलिए हमें निम्न तालिकाएँ बनानी होंगी

  • आदेश_मासिक तालिका:इस तालिका का उपयोग फ्लैट फ़ाइल से मासिक ऑर्डर डेटा संग्रहीत करने के लिए किया जाता है।
  • Import_Config तालिका: इस तालिका का उपयोग आयात कॉन्फ़िगरेशन यानी साझा फ़ोल्डर पथ, फ्लैट फ़ाइल प्रकार, सीमांकक को संग्रहीत करने के लिए किया जाता है।

 टेबल बनाएं [डीबीओ]। varchar](50) NULL, [ContactPersonName] [varchar](50) NOT NULL, [BackorderOrderID] [varchar](4) NULL, [OrderDate] [तारीख] नॉट न्यूल, [अपेक्षित डिलीवरीडेट] [तिथि] नॉट न्यूल, [CustomerPurchaseOrderNumber ] [nvarchar] (20) NULL, [IsUndersupplyBackordered] [बिट] नॉट न्यूल, [टिप्पणियाँ] [nvarchar] (अधिकतम) NULL, [डिलिवरी निर्देश] [nvarchar] (अधिकतम) NULL, [आंतरिक टिप्पणियाँ] [nvarchar] (अधिकतम) NULL , [पिकिंग कम्पलीटेडव्हेन] [डेटटाइम 2] (7) न्यूल, [लास्ट एडिटेडबी] [इंट] नॉट न्यूल, [लास्ट एडिटेडव्हेन] [डेटटाइम 2] (7) न्यूल नहीं, सीमित [पीके_ऑर्डर्स_मासिक] प्राथमिक कुंजी क्लस्टर ([ऑर्डर आईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [USERDATA]) ऑन [USERDATA] TEXTIMAGE_ON [USERDATA]GO

टेबल बनाएं [डीबीओ]। [इम्पोर्ट_कॉन्फिग] ([एक्सप_आईडी] [इंट] पहचान (1,1) न्यूल, [शेयरफोल्डर] [एनचर] (200) न्यूल नहीं, [फाइल टाइप] [वर्कर] (5) नहीं NULL, [Delimiter] [char](1) NOT NULL) ऑन [USERDATA]GO

आयात_कॉन्फ़िग में डेटा डालें

सेट IDENTITY_INSERT [dbo]। [Import_Config] GOINSERT पर [dbo]। ऑर्डरमाथली', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo]।[Import_Config] OFFGO

संग्रहीत प्रक्रिया निर्माण और पैरामीटर

निर्यात संग्रहीत प्रक्रिया के समान।

CREATE PROCEDURE [dbo]। प्रारंभ करें, आयात तालिका से कॉन्फ़िगरेशन प्राप्त करेंDECLARE @ImportPath VARCHAR(200), @Delimiter CHAR(1),@FileType VARCHAR(5),@FilePath VARCHAR(200) SELECT @ImportPath =TRIM(ShareFolder),@FileType =TRIM(FileType ) ,@Delimiter =TRIM(Delimiter) फ्रॉम dbo.Import_Config

पैरामीटर सत्यापन

निर्यात संग्रहीत प्रक्रिया के समान।

सेट @FolderPath =@ImportPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' END ELSE BEGIN --SELECT @ FolderPath ='\\AASHREEPC\FileServer\OrdersMonthly' चुनें 'ERROR FolderPath निर्दिष्ट किया जाना चाहिए।' वापसी; END END --#endregion Parametes सत्यापन

जांचें कि फ़ाइल मौजूद है या नहीं

टेबल #फाइल बनाएं (फाइलनाम SYSNAME, गहराई टिन्यिनट, इसफाइल टिन्यिनट); #फ़ाइल (फ़ाइल नाम, गहराई, आईएसफ़ाइल) में डालें EXEC xp_DirTree @FolderPath,1,1 शीर्ष 1 चुनें @FilePath =@FolderPath + '\' + FileName से #File ORDER BY FileName DESC; अगर NULLIF ((फ़ाइल नाम डीईएससी द्वारा # फ़ाइल ऑर्डर से शीर्ष 1 फ़ाइल नाम चुनें), '') पूर्ण शुरुआत है 'त्रुटि आयात फ़ाइल मौजूद नहीं है' रिटर्न चुनें; END DROP TABLE # बल्क इंसर्ट का उपयोग करके साझा फ़ोल्डर से डेटा आयात करेंDECLARE @SQL_BULK VARCHAR(MAX) DecLare @Errorlog varchar (Max) =@FolderPath + '\Error.log' SET @SQL_BULK ='बल्क इंसर्ट [Orders_Monthly] FROM '' ' + @FilePath + ''' के साथ ( DATAFILETYPE =''char'', BATCHSIZE =50000,CODEPAGE =''RAW'', FIRSTOW =1, FIELDTERMINATOR =''[email protected]+''', ROWTERMINATOR =''\n'', KEEPNULLS, ERRORFILE ='''+ @Errorlog + ''', MAXERRORS =20000, TABLOCK)' EXEC (@SQL_BULK)END कोशिश करें कैच चुनें ERROR_NUMBER() AS ErrorNumber ,ERROR_STATE() AS ErrorState ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS Err या संदेश; END CATCH NOCOUNT OFF;END

प्रक्रिया निष्पादित करना

DECLARE @return_value intEXEC @return_value =[dbo]।[Imp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULL SELECT 'Return Value' =@return_valueGO

आउटपुट

सत्यापन

प्रक्रिया को स्वचालित करना:

निर्यात और आयात प्रक्रिया को निर्धारित समय में स्वचालित रूप से चलाने के लिए। मान लें कि हमें महीने के पहले दिन पिछले महीने की रिपोर्ट के लिए महीने के 12:00 बजे निर्यात चलाने और बाद में आयात चलाने की आवश्यकता है। तो उसके लिए हमें SQL जॉब बनाने की जरूरत है।

निर्यात और आयात के लिए SQL जॉब बनाने के चरण।

  • एमएस एसक्यूएल सर्वर प्रबंधन स्टूडियो खोलें →
  • और आपके पास "SQL सर्वर एजेंट" होना चाहिए →
  • ऑब्जेक्ट एक्सप्लोरर पर "एसक्यूएल सर्वर एजेंट" का विस्तार करें। →
  • JOB पर राइट-क्लिक करें और "New Job..." चुनें →
  • आप "नई नौकरी" विंडो देख सकते हैं और नाम दर्ज कर सकते हैं ="Orders_Monthly_Export" और विवरण

फिर स्टेप्स टैब पर जाएं → नीचे में नया बटन क्लिक करें → एक नई जॉब स्टेप्स विंडो खुलती है → नाम दर्ज करें ="निष्पादित करें [Exp_Orders_Monthly_Report] SP" और टाइप करें ="ट्रांजैक्ट-एसक्यूएल स्क्रिप्ट (टी-एसक्यूएल)" → निम्नलिखित स्क्रिप्ट पेस्ट करें कमांड टेक्स्ट क्षेत्र में और ओके पर क्लिक करें।

उपयोग [वाइडवर्ल्ड इम्पोर्टर्स]GODECLARE @return_value int+EXEC @return_value =[dbo]।[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLSELECT 'रिटर्न वैल्यू' =@return_valueGO

फिर शेड्यूल टैब पर जाएं → नीचे दिए गए न्यू बटन पर क्लिक करें → एक नई जॉब शेड्यूल विंडो खुलती है। नाम दर्ज करें ="मासिक शेड्यूल ऑर्डर करें" और निम्नलिखित विवरण दर्ज करें और ओके पर क्लिक करें → फिर से नई जॉब विंडो में ओके पर क्लिक करें।

कार्य सफलतापूर्वक सृजित हो जाएगा।

SQL कार्य का परीक्षण करें:

परीक्षण के लिए साझा फ़ोल्डर में सभी फ़ाइलें हटाएं।

परीक्षण के लिए कार्य को मैन्युअल रूप से चलाने के लिए:नई बनाई गई नौकरी पर राइट क्लिक करें → 'स्टेप पर नौकरी शुरू करें ..' पर क्लिक करें और हम नौकरी को चल रहे देख सकते हैं

हम देख सकते हैं कि फ़ाइल साझा फ़ोल्डर में बनाई गई है।

नोट:कृपया आयात के लिए भी SQL कार्य (Orders_Monthly_Import) बनाने के लिए उपरोक्त चरणों का पालन करें।

मुझे आशा है कि अब आपको बीसीपी उपयोगिता का उपयोग करने की बेहतर समझ है।

उपयोगी टूल:

dbForge डेटा पंप - SQL डेटाबेस को बाहरी स्रोत डेटा से भरने और सिस्टम के बीच डेटा माइग्रेट करने के लिए एक SSMS ऐड-इन।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. उत्सुक सूचकांक स्पूल और अनुकूलक

  2. DROP से बेहतर ALTER

  3. पढ़ें प्रतिबद्ध अलगाव स्तर

  4. एक ऑनलाइन सर्वेक्षण के लिए एक डेटाबेस मॉडल। भाग 2

  5. प्राथमिक कुंजी पर अनुक्रमणिका के लिए एक साधारण उपयोग केस