sql >> Databáze >  >> RDS >> Database

Jak exportovat data do plochého souboru pomocí nástroje BCP a importovat data pomocí hromadného vkládání

Nástroj BCP (Program hromadného kopírování) v SQL Server umožňuje správcům databází importovat data do tabulky a exportovat data z tabulky do plochého souboru. Nástroj BCP také podporuje různé funkce, které usnadňují proces exportu a importu hromadných dat.

Nyní začněme s obchodním scénářem.

Obchodní scénář

Řekněme, že potřebujeme sdílet měsíční přehled ve specifickém formátu s klientem v zabezpečeném sdíleném umístění, jako je SFTS, tj. na začátku každého měsíce musíme klientovi odeslat soubor za předchozí měsíc. V tomto scénáři se pokusíme vytvořit uloženou proceduru pro generování dat a exportovat tato data do plochého souboru (.txt nebo .csv).

Jak importovat a exportovat data SQL?

Existuje několik způsobů, jak to provést:

  • Pomocí SSMS spusťte dotaz v okně Query a exportujte nebo průvodce importem a exportem SQL Server.
  • Použití SSIS – Vytvoření balíčku pomocí SSDT.
  • Pomocí SSRS.
  • Použití C# – Vytvořte konzoli nebo aplikaci win k exportu.
  • Nástroj BCP.
  • atd.

Co je BCP Utility?

Nástroj BCP (Program hromadného kopírování) je nástroj příkazového řádku pro kopírování dat mezi instancí MS SQL Server a datovým souborem v uživatelem zadaném formátu. Můžeme rychle a snadno exportovat a importovat velké množství dat do az databází SQL Server.

Nástroj BCP provádí následující úkoly:

  • Hromadný export dat z tabulky SQL Serveru do datového souboru.
  • Hromadný export dat z dotazu/uložené procedury.
  • Hromadný import dat z datového souboru do tabulky serveru SQL.
  • Generování souborů formátu.

Více podrobností o BCP Utility naleznete zde.

Použité prostředí

  • SQL Server 2017 Developer Edition
  • SQL server 2017 Management studio
  • Ukázková databáze dovozců z celého světa v1.0
  • Nástroj BCP

Jak exportovat data do plochého souboru

Vytvořte uloženou proceduru pro generování dat měsíčního přehledu.

Nejprve vytvořte závislé objekty pro export uloženou proceduru.

Musíme tedy vytvořit následující tabulky:

  • Tabulka Orders_Monthly_Temp_Table tabulka:tato dočasná tabulka se používá k ukládání dat o měsíčních objednávkách ve specifickém formátu pro export do textového souboru, tj. v našem případě zřetězení všech sloupců do jednoho řádku s oddělovačem „|“.
  • Položka Export_Config tabulka:tato tabulka se používá k ukládání konfigurací exportu, tj. cesty ke sdílené složce, typu plochého souboru, oddělovače.

Vytvořte skript pro Orders_Monthly_Temp_Table

VYTVOŘTE TABULKU [dbo].[Orders_Monthly_Temp_Table]( [Řádek] [varchar](200) NOT NULL) NA [PRIMARY]

Vytvořte skript pro Export_Config

CREATE TABLE [dbo].[Export_Config]( [Exp_Id] [int] IDENTITY(1,1) NOT NULL, [ShareFolder] [varchar](200) NOT NULL, [FileType] [varchar](5) NOT NULL, [Delimiter] [char](1) NOT NULL, CONSTRAINT [PK_Export_Config] PRIMÁRNÍ KLÍČ SE SLUSTROVANÝ ( [Exp_Id] ASC)WITH (PAD_INDEX =VYPNUTO, STATISTICS_NORECOMPUTE =VYPNUTO, IGNORE_DUP_KEY =VYPNUTO, PAGE_ALLOW =VYPNUTO, PAGE_ALLOW =VYPNUTO) [USERDATA]) NA [USERDATA]PŘEJÍT

Vložte data do Export_Config

NASTAVTE IDENTITY_INSERT [dbo].[Export_Config] NA GOINSERT [dbo].[Export_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) HODNOTY (1, N'\\AASHREEPC\FileServer\ OrdersMonthly', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo].[Export_Config] OFFGO

Vytvoření a parametry uložené procedury

  • Parametry roku a měsíce jsou zde volitelné.
  • Pokud není zadán měsíc, trvá předchozí měsíc, a pokud je měsíc 12, musíme vzít předchozí rok, protože pokud sestavu generujeme v lednu 2019 za prosinec 2018.
  • Pokud není zadán rok, použije se aktuální rok a cesta ke složce je povinná.
CREATE PROCEDURE [dbo].[Orders_Monthly_Report] @Month INT =NULL ,@Year INT =NULL ,@FolderPath VARCHAR(200) ASBEGIN SET NOCOUNT ON; ZAČNĚTE ZKUSIT

Ověření parametrů

--#region Ověření parametrů POKUD NULLIF(@Měsíc, '') JE NULL ZAČÁTEK VYBRAT @Měsíc =DATEPART(mm, DATEADD(měsíc, - 1, GETDATE())) IF (@Měsíc =12) – ZAČÁTEK SELECT @Year =DATEPART(Year, GETDATE()) - 1 END END IF NULLIF(@Year, '') IS NULL BEGIN SELECT @Year =DATEPART(Year, GETDATE()) END IF NULLIF(@FolderPath, '') IS NULL BEGIN --SELECT @FolderPath ='\\AASHREEPC\FileServer' SELECT 'Chyba ke složce musí být zadána.' VRÁTIT SE; END --#endregion Ověření parametrů

Získejte konfiguraci z exportní tabulky

DECLARE @ExportPath VARCHAR(200) ,@Delimiter CHAR(1) ,@FileType VARCHAR(5) SELECT @ExportPath =TRIM(ShareFolder) ,@FileType =TRIM(FileType) ,@Delimiter =TRIM(Delimiter) FROM .Export_Config

Zjištění počátečního a koncového data měsíce

DECLARE @MonthStartDate DATETIME =DATEADD(měsíc, @Month - 1, DATEADD(rok, @Rok - 1900, 0)) ,@MonthEndDate DATETIME =DATEADD(den, - 1, DATEADD(měsíc, @Month, DATEADD( rok, @Rok - 1900, 0)))Zkontrolujte a vytvořte dočasnou tabulku pro data/výsledek sestavy, POKUD NEEXISTUJE ( SELECT * FROM sys.objects WHERE object_id =OBJECT_ID(N'[dbo].[Orders_Monthly_Temp_Table]') A zadejte IN (N'U') ) ZAČNĚTE VYTVOŘIT TABULKU [dbo].Orders_Monthly_Temp_Table ([Řádek] [varchar](200) NOT NULL) NA [PRIMÁRNÍ] KONCI

Vložte data do dočasné tabulky ve specifickém formátu, tj. v tomto případě „| – symbol potrubí oddělen“

ZKRÁTIT TABULKU Orders_Monthly_Temp_TableINSERT INTO Orders_Monthly_Temp_Table SELECT CAST([OrderID] AS VARCHAR(10)) + ' | ' + CAST(c.[CustomerName] AS VARCHAR(50)) + ' | ' + CAST(p.[Celé jméno] AS VARCHAR(50)) + ' | ' + ISNULL(CAST([PickedByPersonID] AS VARCHAR(4)), '') + ' | ' + CAST(p.[Celé jméno] AS VARCHAR(20)) + ' | ' + ISNULL(CAST([BackorderOrderID] AS VARCHAR(4)), '') + ' | ' + CAST([Datum objednávky] AS VARCHAR(20)) + ' | ' + CAST([ExpectedDeliveryDate] AS VARCHAR(20)) + ' | ' + CAST([CustomerPurchaseOrderNumber] AS VARCHAR(10)) + ' | ' + CAST([IsUndersupplyBackordered] AS VARCHAR(4)) + ' | ' + ISNULL(CAST([Komentáře] AS VARCHAR(50)), '') + ' | ' + ISNULL(CAST([Instrukce k doručení] AS VARCHAR(50)), '') + ' | ' + ISNULL(CAST([Interní komentáře] AS VARCHAR(50)), '') + ' | ' + CAST([PickingCompletedWhen] AS VARCHAR(20)) + ' | ' + CAST(o.[LastEditedBy] AS VARCHAR(4)) + ' | ' + CAST([LastEditedWhen] AS VARCHAR(20)) AS Řádek FROM [WideWorldImporters].[Prodej].[Objednávky] o VNITŘNÍ PŘIPOJENÍ [Prodej].[Zákazníci] c ON o.[ID zákazníka] =c.[ID zákazníka] VNITŘNÍ PŘIPOJENÍ [Aplikace].[Lidé] p ON o.[ID osoby prodejce] =p.[ID osoby] KDE Datum objednávky MEZI @MonthStartDate A @MonthEndDate

Kód pro export dat do plochého souboru

Vytvořte složku, pokud neexistuje, pomocí SQL xp_create_subdir

DECLARE @sql VARCHAR(8000) ,@FilePath VARCHAR(200) ,@Query VARCHAR(100) DECLARE @file_results TABLE ( file_exists INT ,file_je_a_directory INT ,parent_directory\olderPath INTF' SET (@Year AS VARCHAR(10)) + '\' + CAST (@Month AS VARCHAR(10)) + '\' INSERT INTO @file_results EXEC MASTER.dbo.xp_fileexist @FolderPath POKUD NEEXISTUJE ( SELECT 1 FROM @file_results WHERE file_is_a_directory =1 ) EXEC MASTER.dbo.xp_create_subdir @FolderPath

Vytvoření souboru ve sdílené složce

SET @FilePath ='"' + @FolderPath + '' + 'Orders_Monthly' + '_' + ( SELECT Format(GETDATE(), N'yyyyMMddHHmmss') ) + '.txt"' SET @Query =' "SELECT * from ' + ( SELECT 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 + ' queryout ' + @FilePath + ' -T -c -q -t0x7c -r\n ' --+ @@název serveru EXEC master..xp_cmdshell @sql KONEC TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_STATE() AS ErrorState ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLineESSAGE(ERROR)Error_Message END CATCH SET NOCOUNT OFF;END

Změňte kontext adresáře na složku, kde se nachází nástroj BPC Utility

[id tabulky=58 /]

Provedení procedury

DECLARE @return_value intEXEC @return_value =[dbo].[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLSELECT 'Vrácená hodnota' =@return_valueGO

Výstup

Cílová složka

Aktuální plochý soubor (.txt/.cvs)

Sdílená složka by měla mít oprávnění k virtuálnímu účtu „NT SERVICE\MSSQLSERVER“

Klepněte pravým tlačítkem na soubor nebo složku, pro kterou chcete nastavit oprávnění → Klepněte na Vlastnosti → Klepněte na kartu Zabezpečení. → Klepněte na Upravit → Klepněte na Přidat → Do pole názvu objektu zadejte NT SERVICE\MSSQLSERVER. (neklikejte na „Zkontrolovat jména“ – pokud kliknete na Zkontrolovat jména, může se stát, že se zobrazí chyba „Objekt s názvem „NT SERVICE\MSSQLSERVER“ nebyl nalezen.) → Klikněte na OK → vyberte účet MSSQLSERVER → Přidat oprávnění ( Úplná kontrola), které jsou potřebné pro účet MSSQLSERVER:

Povolte „xp_cmdshell“ SQL Server

EXEC sp_configure 'zobrazit pokročilé možnosti', 1GORECONFIGUREGOEXEC sp_configure 'xp_cmdshell', 1GORECONFIGUREGO

Jak importovat data z plochého souboru

V tomto příkladu používáme hromadné vkládání k importu dat ze souboru. Můžeme také použít Openrowset atd.

Vytvořte uloženou proceduru pro import dat z plochého souboru ve sdílené složce.

Nejprve vytvořte závislé objekty pro import uloženou proceduru.

Musíme tedy vytvořit následující tabulky

  • Objednávky_Měsíčně tabulka:tato tabulka se používá k ukládání údajů o měsíčních objednávkách z plochého souboru.
  • Položka Import_Config tabulka: tato tabulka se používá k uložení konfigurací importu, tj. cesty ke sdílené složce, typu plochého souboru, oddělovače.

CREATE TABLE [dbo].[Orders_Monthly]( [ID objednávky] [int] NOT NULL, [CustomerName] [varchar](50) NOT NULL, [SalespersonPersonName] [varchar](50) NOT NULL, [PickedByPersonName] [ varchar](50) NULL, [jméno kontaktní osoby] [varchar](50) NOT NULL, [BackorderOrderID] [varchar](4) NULL, [Datum objednávky] [datum] NOT NULL, [OčekávanéDatum doručení] [datum] NOT NULL, [CustomerNurchaseO ] [nvarchar](20) NULL, [IsUndersupplyBackordered] [bit] NOT NULL, [Komentáře] [nvarchar](max) NULL, [DeliveryInstructions] [nvarchar](max) NULL, [InternalComments] [nvarchar](max) NULL , [PickingCompletedWhen] [datetime2](7) NULL, [LastEditedBy] [int] NOT NULL, [LastEditedWhen] [datetime2](7) NOT NULL, CONSTRAINT [PK_Orders_Monthly] PRIMÁRNÍ KLÍČ SE SLUSTROVANÝ ([ID objednávky] ASC_INDEX)WITH =VYPNUTO, STATISTICS_NORECOMPUTE =VYPNUTO, IGNORE_DUP_KEY =VYPNUTO, ALLOW_ROW_LOCKS =ZAPNUTO, ALLOW_PAGE_LOCKS =ZAPNUTO) ZAPNUTO [USERDATA]) ZAPNUTO [USERDATA] TEXTIMAGE_ON [USERDATA]PŘEJÍT

CREATE TABLE [dbo].[Import_Config]( [Exp_Id] [int] IDENTITY(1,1) NOT NULL, [ShareFolder] [nchar](200) NOT NULL, [FileType] [varchar](5) NOT NULL, [Oddělovač] [znak](1) NOT NULL) NA [USERDATA]PŘEJÍT

Vložte data do Import_Config

NASTAVTE IDENTITY_INSERT [dbo].[Import_Config] NA GOINSERT [dbo].[Import_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) HODNOTY (1, N'\\AASHREEPC\FileServer\ OrdersMonthly', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo].[Import_Config] OFFGO

Vytvoření a parametry uložené procedury

Stejné jako u exportu Uložená procedura.

CREATE PROCEDURE [dbo].[Imp_Orders_Monthly_Report] @Month INT =NULL ,@Year INT =NULL ,@FolderPath VARCHAR(200) =NULLASBEGIN SET NOCOUNT ON; ZAČNĚTE TRYZískejte konfiguraci z importní tabulkyDECLARE @ImportPath VARCHAR(200) ,@Delimiter CHAR(1) ,@FileType VARCHAR(5) ,@FilePath VARCHAR(200) SELECT @ImportPath =TRIM(ShareFolder) ,@FileType =TRIM ) ,@Delimiter =TRIM(Delimiter) FROM dbo.Import_Config

Ověření parametrů

Stejné jako u exportu Uložená procedura.

SET @FolderPath =@ImportPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' END ELSE BEGIN --SELECT @ FolderPath ='\\AASHREEPC\FileServer\OrdersMonthly' SELECT 'Chyba je třeba zadat cestu ke složce.' VRÁTIT SE; END END --#endregion Ověření parametrů

Zkontrolujte, zda soubor existuje nebo ne

CREATE TABLE #File (Název souboru SYSNAME ,Hloubka TINYINT ,IsFile TINYINT ); INSERT INTO #File ( FileName ,Depth ,IsFile ) EXEC xp_DirTree @FolderPath ,1 ,1 SELECT TOP 1 @FilePath =@FolderPath + '\' + FileName FROM #File ORDER BY FileName DESC; IF NULLIF((SELECT TOP 1 FileName FROM #File ORDER BY FileName DESC), '') IS NULL BEGIN SELECT 'ERROR import File neexistuje' RETURN; END DROP TABLE #FileImportujte data ze sdílené složky pomocí hromadného vloženíDECLARE @SQL_BULK VARCHAR(MAX) DecLare @Errorlog varchar (Max) =@FolderPath + '\Error.log' SET @SQL_BULK ='HROMADNÉ VLOŽENÍ [Orders_Monthly'' FROM ' + @FilePath + ''' WITH ( DATAFILETYPE =''char'' ,BATCHSIZE =50000 ,CODEPAGE =''RAW'' ,FIRSTROW =1 ,FIELDTERMINATOR ='''[email protected]+'TERMINA, ''\n'' ,KEEPNULLS ,ERRORFILE ='''+ @Errorlog + ''' ,MAXERRORS =20000 ,TABLOCK )' EXEC (@SQL_BULK)END ZKUSTE ZAČÍT ZAČNĚTE VYBRAT ERROR_NUMBER() JAKO ErrorNumber ,Error_Sta(te)ASr_ ,ERROR_SEVERITY() AS Závažnost chyby ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS Err neboZpráva; END CATCH SET NOCOUNT OFF;END

Provedení procedury

DECLARE @return_value intEXEC @return_value =[dbo].[Imp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULL SELECT 'Vrácená hodnota' =@return_valueGO

Výstup

Ověření

Automatizace procesu:

Pro automatické spouštění procesu exportu a importu v naplánovaném čase. řekněme, že potřebujeme spustit export první den v měsíci ve 00:00 v měsíci pro přehled za poslední měsíc a import spustit později. Takže pro to musíme vytvořit SQL Job.

Kroky k vytvoření úlohy SQL pro export a import.

  • Otevřete MS SQL Server Management Studio →
  • a měli byste mít „SQL Server Agent“ →
  • Rozbalte položku „SQL Server Agent“ v Průzkumníku objektů. →
  • Klikněte pravým tlačítkem na ÚLOHU a vyberte „Nová úloha…“ →
  • Uvidíte okno „Nová zakázka“ a zadejte název =„Objednávky_Měsíční_Export“ &Popis

Poté přejděte na kartu Kroky → Klepněte na tlačítko Nové ve spodní části → otevře se nové okno Kroky úlohy → Zadejte název =„execute [Exp_Orders_Monthly_Report] SP“ a Typ =„Skript Transact-SQL (T-SQL)“ → Vložte následující skript v oblasti Text příkazu a klepněte na OK.

POUŽÍVEJTE [WideWorldImporters]GODECLARE @return_value int+EXEC @return_value =[dbo].[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLSELECT 'Vrácená hodnota'u =@preturn_> 

Poté přejděte na kartu Plán → Klepněte na tlačítko Nové ve spodní části → otevře se okno Plán nové úlohy. Zadejte Název =„Měsíční plán objednávek“ a zadejte následující podrobnosti a klikněte na OK → Znovu klikněte na OK v okně Nová úloha.

Úloha by byla úspěšně vytvořena.

Otestujte úlohu SQL:

Pro testování odstraňte všechny soubory ve sdílené složce.

Chcete-li úlohu spustit ručně za účelem testování:Klikněte pravým tlačítkem na nově vytvořenou úlohu → klikněte na „Spustit úlohu v kroku...“ a můžeme vidět, jak úloha běží

Vidíme, že soubor je vytvořen ve složce Shared.

Poznámka:Podle výše uvedených kroků vytvořte také úlohu SQL (Orders_Monthly_Import) pro import.

Doufám, že nyní lépe rozumíte tomu, jak používat nástroj BCP.

Užitečný nástroj:

dbForge Data Pump – doplněk SSMS pro plnění databází SQL externími zdrojovými daty a migraci dat mezi systémy.


  1. MariaDB JSON_ARRAYAGG() Vysvětleno

  2. Oracle 12:Připojit se na seznam oddělený čárkami?

  3. Tisk hodnoty proměnné v SQL Developer

  4. ORACLE SQL:Získejte všechna celá čísla mezi dvěma čísly