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.