sql >> Database teknologi >  >> RDS >> Database

Sådan eksporteres data til flad fil med BCP Utility og importerer data med Bulk Insert

BCP-værktøjet (Bulk Copy Program) i SQL Server giver databaseadministratorer mulighed for at importere data til en tabel og eksportere data fra en tabel til en flad fil. BCP-værktøjet understøtter også forskellige funktioner, der letter processen med eksport og import af massedata.

Lad os nu komme i gang med et forretningsscenarie.

Forretningsscenarie

Lad os sige, at vi skal dele en månedlig rapport i det specifikke format til en klient på en sikret delt placering som SFTS, dvs. i begyndelsen af ​​hver måned skal vi sende filen til en klient for den foregående måned. I dette scenarie vil vi forsøge at oprette den lagrede procedure til at generere data og eksportere disse data til den flade fil (.txt eller .csv).

Hvordan importeres og eksporteres SQL-dataene?

Der er flere måder at gøre dette på:

  • Brug SSMS, kør forespørgslen i forespørgselsvinduet og eksportér eller SQL Server import- og eksportguide.
  • Brug af SSIS – Oprettelse af en pakke ved hjælp af SSDT.
  • Bruger SSRS.
  • Brug af C# – Opret konsol eller vind applikation til eksport.
  • BCP-værktøj.
  • osv.

Hvad er BCP Utility?

BCP (Bulk copy program) hjælpeprogram er et kommandolinjeværktøj til at kopiere data mellem en forekomst af MS SQL Server og en datafil i et brugerspecificeret format. Vi kan eksportere og importere store mængder data ind og ud af SQL Server-databaserne hurtigt og nemt.

BCP-værktøjet udfører følgende opgaver:

  • Masseeksport af data fra en SQL Server-tabel til en datafil.
  • Eksport af massedata fra en forespørgsel/lagret procedure.
  • Masseimport af data fra en datafil til en SQL Server-tabel.
  • Generering af formatfilerne.

Du kan finde flere detaljer om BCP Utility her.

Anvendt miljø

  • SQL Server 2017 Developer Edition
  • SQL server 2017 Management studio
  • Wide World Importers eksempeldatabase v1.0
  • BCP Utility

Sådan eksporterer du data til en flad fil

Opret en lagret procedure for at generere de månedlige rapportdata.

Først skal du oprette de afhængige objekter til den lagrede eksportprocedure.

Så vi skal oprette følgende tabeller:

  • Ordre_Månedlig_Temp_Tabel tabel:denne midlertidige tabel bruges til at gemme de månedlige ordredata i et bestemt format for at eksportere det til en tekstfil, dvs. i vores tilfælde sammenkæde alle kolonnerne i én række med skilletegn "|".
  • Export_Config tabel:denne tabel bruges til at gemme eksportkonfigurationer, dvs. delt mappesti, flad filtype, skilletegn.

Opret et script til Orders_Monthly_Temp_Table

OPRET TABEL [dbo].[Orders_Monthly_Temp_Table]( [Row] [varchar](200) IKKE NULL) PÅ [PRIMÆR]

Opret et script til Export_Config

OPRET TABEL [dbo].[Export_Config]( [Exp_Id] [int] IDENTITY(1,1) NOT NULL, [ShareFolder] [varchar](200) NOT NULL, [FileType] [varchar](5) NOT NULL, [Afgrænser] [char](1) IKKE NULL, BEGRÆNSNING [PK_Export_Config] PRIMÆR NØGLE KLUSTERET ( [Exp_Id] ASC) MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =SLUKKE_FRA_,_ALLÅ, PÅ,_) [USERDATA]) PÅ [USERDATA]GO

Indsæt data i Export_Config

SET IDENTITY_INSERT [dbo].[Export_Config] ON GOINSERT [dbo].[Export_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) VÆRDIER (1, N'\\AASHREEPC\FileServer\ OrdersMonthly', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo].[Export_Config] OFFGO

Oprettelse af lagret procedure og parametre

  • Her er år- og månedsparametrene valgfrie.
  • Hvis en måned ikke er angivet, tager det den foregående måned, og hvis måneden er 12, skal vi tage det foregående år, for hvis vi genererer rapporten i januar 2019 for december 2018.
  • Hvis et år ikke er angivet, tager det det aktuelle år, og mappestien er obligatorisk.
CREATE PROCEDURE [dbo].[Orders_Monthly_Report] @Month INT =NULL ,@Year INT =NULL ,@FolderPath VARCHAR(200) ASBEGIN SET NOCOUNT ON; START PRØV

Parametervalidering

--#region Parametrevalidering HVIS NULLIF(@Month, '') IS NULL BEGIN SELECT @Month =DATEDEL(mm, DATEADD(month, - 1, GETDATE())) IF (@Month =12) – BEGIN 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' VÆLG 'FEJL FolderPath skal angives.' VEND TILBAGE; END --#endregion Validering af parametre

Hent konfigurationen fra eksporttabellen

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

Hent månedens startdato og slutdato

ERKLÆR @MonthStartDate DATETIME =DATEADD(month, @Month - 1, DATEADD(år, @År - 1900, 0)) ,@MonthEndDate DATETIME =DATEADD(dag, - 1, DATEADD(måned, @Month, DATEADD( år, @År - 1900, 0)))Tjek og opret den midlertidige tabel for rapportdata/resultatHVIS IKKE FINNES (VÆLG * FRA sys.objects WHERE object_id =OBJECT_ID(N'[dbo].[Orders_Monthly_Temp_Table]') OG skriv IN (N'U') ) BEGYND OPRET TABEL [dbo].Orders_Monthly_Temp_Table ([Row] [varchar](200) NOT NULL) ON [PRIMARY] END

Indsæt dataene i temp-tabellen i et specifikt format, dvs. i dette tilfælde "| – rørsymbol adskilt”

TRUNCATE TABLE Orders_Monthly_Temp_TableINSERT INTO Orders_Monthly_Temp_Table SELECT CAST([OrderID] AS VARCHAR(10)) + ' | ' + CAST(c.[Kundenavn] SOM VARCHAR(50)) + ' | ' + CAST(s.[Fuldt navn] AS VARCHAR(50)) + ' | ' + ISNULL(CAST([PickedByPersonID] AS VARCHAR(4)), '') + ' | ' + CAST(s.[Fuldt navn] AS VARCHAR(20)) + ' | ' + ISNULL(CAST([BackorderID] AS VARCHAR(4)), '') + ' | ' + CAST([OrderDate] AS VARCHAR(20)) + ' | ' + CAST([Forventet leveringsdato] SOM VARCHAR(20)) + ' | ' + CAST([Kundekøbsordrenummer] SOM VARCHAR(10)) + ' | ' + CAST([IsUndersupplyBackordered] SOM VARCHAR(4)) + ' | ' + ISNULL(CAST([Kommentarer] SOM VARCHAR(50)), '') + ' | ' + ISNULL(CAST([Leveringsinstruktioner] SOM VARCHAR(50)), '') + ' | ' + ISNULL(CAST([Interne kommentarer] SOM VARCHAR(50)), '') + ' | ' + CAST([PickingCompletedWhen] AS VARCHAR(20)) + ' | ' + CAST(o.[Sidst redigeret Af] SOM VARCHAR(4)) + ' | ' + CAST([LastEditedWhen] AS VARCHAR(20)) AS Row FROM [WideWorldImporters].[Salg].[Ordrer] o INNER JOIN [Salg].[Kunder] c PÅ o.[Kunde-ID] =c.[Kunde-ID] INNER JOIN [Ansøgning].[People] p ON o.[SælgerPersonID] =p.[PersonID] HVOR OrderDate MELLEM @MonthStartDate OG @MonthEndDate

Kode til at eksportere dataene til en flad fil

Opret mappen, hvis den ikke findes ved hjælp af SQL xp_create_subdir

DECLARE @sql VARCHAR(8000) ,@FilePath VARCHAR(200) ,@Query VARCHAR(100) DECLARE @file_results TABLE (fil_eksisterer INT ,fil_er_en_mappe INT ,overordnet_mappe_eksisterer @FolderPath =@FolderPath 'SÆT @FolderP' +FolderP) (@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' INSERT INTO @file_results EXEC MASTER.dbo.xp_fileexist @FolderPath HVIS IKKE FINDER (VÆLG 1 FRA @file_results WHERE_RESULTS file_is_a_directory =1 ) EXEC MASTER.dbo.xp_create_subdir @FolderPath

Oprettelse af filen i den delte mappe

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 ' --+ @@servernavn EXEC master..xp_cmdshell @sql AFSLUT PRØV BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_STATE() AS ErrorState ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGEs() AS; SLUT FANGST SÆT INGEN ANTAL FRA; END

Skift din mappekontekst til den mappe, hvor BPC Utility er placeret

[tabel id=58 /]

Udførelse af proceduren

DECLARE @return_value intEXEC @return_value =[dbo].[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLSELECT 'Returnværdi' =@return_valueGO

Output

Destinationsmappe

Faktisk flad fil (.txt/.cvs)

Delt mappe skal have tilladelser til den virtuelle konto "NT SERVICE\MSSQLSERVER"

Højreklik på den fil eller mappe, du vil angive tilladelser → Klik på Egenskaber → Klik på fanen Sikkerhed. → Klik på Rediger → Klik på Tilføj → Skriv NT SERVICE\MSSQLSERVER i feltet med objektnavn. (ikke klik på "Kontroller navne" – hvis du klikker på Tjek navne, kan det ske, at du får en fejlmeddelelse 'Et objekt med navnet "NT SERVICE\MSSQLSERVER" kan ikke findes). → Klik på OK → vælg MSSQLSERVER-kontoen → Tilføj tilladelser ( Fuld kontrol), der er nødvendige for MSSQLSERVER-kontoen:

Aktiver ‘xp_cmdshell’ SQL Server

EXEC sp_configure 'vis avancerede indstillinger', 1GORECONFIGUREGOEXEC sp_configure 'xp_cmdshell', 1GORECONFIGUREGO

Sådan importeres data fra flad fil

I dette eksempel bruger vi Bulk Insert til at importere data fra filen. Vi kan også bruge Openrowset osv.

Opret en lagret procedure for at importere data fra en flad fil i den delte mappe.

Opret først de afhængige objekter til den lagrede importprocedure.

Så vi er nødt til at oprette følgende tabeller

  • Den Ordrer_Månedlig tabel:denne tabel bruges til at gemme de månedlige ordredata fra den flade fil.
  • Import_Config tabel: denne tabel bruges til at gemme importkonfigurationer, f.eks. delt mappesti, flad filtype, skilletegn.

OPRET TABEL [dbo].[Ordre_Månedlig]( [Ordre-ID] [int] IKKE NULL, [Kundenavn] [varchar](50) IKKE NULL, [SælgerPersonName] [varchar](50) IKKE NULL, [PickedByPersonName] [ varchar](50) NULL, [ContactPersonName] [varchar](50) NOT NULL, [Backorder OrderID] [varchar](4) NULL, [OrderDate] [date] NOT NULL, [ExpectedDeliveryDate] [date] NOT NULL, [CustomerPurchaseOrderN ] [nvarchar](20) NULL, [IsUndersupplyBackordered] [bit] IKKE NULL, [Kommentarer] [nvarchar](max) NULL, [DeliveryInstructions] [nvarchar](max) NULL, [InternalComments] [nvarchar](max) NULL , [PickingCompletedWhen] [datetime2](7) NULL, [LastEditedBy] [int] NOT NULL, [LastEditedWhen] [datetime2](7) IKKE NULL, BEGRÆNSNING [PK_Orders_Monthly] PRIMÆR NØGLE KLUNDET ([OrderID =] ASC_)WILD FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [USERDATA]) PÅ [USERDATA] TEXTIMAGE_ON [USERDATA]GO

CREATE TABLE [dbo].[Import_Config]( [Exp_Id] [int] IDENTITY(1,1) NOT NULL, [ShareFolder] [nchar](200) NOT NULL, [FileType] [varchar](5) NOT NULL, [Delimiter] [char](1) NOT NULL) PÅ [USERDATA]GO

Indsæt data i Import_Config

SET IDENTITY_INSERT [dbo].[Import_Config] ON GOINSERT [dbo].[Import_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) VÆRDIER (1, N'\\AASHREEPC\FileServer\ OrdersMonthly', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo].[Import_Config] OFFGO

Oprettelse af lagret procedure og parametre

Samme som i eksport Lagret procedure.

OPRET PROCEDURE [dbo].[Imp_Orders_Monthly_Report] @Month INT =NULL ,@Year INT =NULL ,@FolderPath VARCHAR(200) =NULLAS BEGIN SET NOCOUNT ON; BEGIN PRØVHent konfigurationen fra importtabellenDECLARE @ImportPath VARCHAR(200) ,@Delimiter CHAR(1) ,@FileType VARCHAR(5) ,@FilePath VARCHAR(200) SELECT @ImportPath =TRIM(ShareFolder) ,@TRIMTFiyplee ) ,@Delimiter =TRIM(Delimiter) FRA dbo.Import_Config

Parametervalidering

Samme som i eksport Lagret procedure.

SET @FolderPath =@ImportPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' END ELSE BEGIN --SELECT @ FolderPath ='\\AASHREEPC\FileServer\OrdersMonthly' VÆLG 'FEJL FolderPath skal angives.' VEND TILBAGE; END END --#endregion Parametrevalidering

Tjek, om filen findes eller ej

OPRET TABEL #Fil (Filnavn SYSNAME ,Dybde TINYINT ,IsFile TINYINT ); INSERT INTO #File ( Filnavn ,Dybde ,IsFile ) EXEC xp_DirTree @FolderPath ,1 ,1 VÆLG TOP 1 @FilePath =@FolderPath + '\' + Filnavn FRA #Fil ORDER BY FileName DESC; HVIS NULLIF((VÆLG TOP 1 Filnavn FRA #Fil ORDER BY FileName DESC), '') IS NULL BEGIN VÆLG 'FEJL import Filen findes ikke' RETURN; END DROP TABEL #FileImporter data fra den delte mappe ved hjælp af Bulk InsertDECLARE @SQL_BULK VARCHAR(MAX) DecLare @Errorlog varchar (Max) =@FolderPath + '\Error.log' SET @SQL_BULK ='BULK INSERT [Orders_'Monthly] FROM 'Monthly] ' + @FilePath + ''' MED ( DATAFILETYPE =''char'' ,BATCHSIZE =50000 ,CODEPAGE =''RAW'' ,FIRSTROW =1 ,FIELDTERMINATOR ='''[email protected]+''' =,ROWTERMINATOR ''\n'' ,KEEPNULLS ,ERRORFILE ='''+ @Errorlog + ''' ,MAXERRORS =20000 ,TABLOCK )' EXEC (@SQL_BULK)END PRØV BEGYND FANG SELECT ERROR_NUMBER() AS ErrorNumber()ERror_Error_Number ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS Err ellerBesked; SLUT FANGST SÆT INGEN ANTAL FRA; END

Udførelse af proceduren

DECLARE @return_value intEXEC @return_value =[dbo].[Imp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULL VÆLG 'Returværdi' =@return_valueGO

Output

Bekræftelse

Automatisering af processen:

Til at køre eksport- og importprocessen automatisk på et planlagt tidspunkt. Lad os sige, at vi skal køre eksporten den første dag i måneden kl. 12.00 i måneden for den sidste måneds rapport og køre importen senere. Så vi skal oprette SQL-jobbet til det.

Trin til at oprette SQL-jobbet til eksport og import.

  • Åbn MS SQL Server Management Studio →
  • og du skulle have "SQL Server Agent" →
  • Udvid "SQL Server Agent" på Object Explorer. →
  • Højreklik på JOB, og vælg "Nyt job..." →
  • Du kan se vinduet "Nyt job" og indtaste navnet ="Ordre_Månedlig_eksport" &Beskrivelse

Gå derefter til fanen Trin → Klik på Ny knap i bunden → et nyt vindue med jobtrin åbnes → Indtast navnet ="udfør [Exp_Orders_Monthly_Report] SP" og skriv ="Transact-SQL Script (T-SQL)" → Indsæt følgende script i kommandotekstområdet, og klik på OK.

BRUG [WideWorldImporters]GODECLARE @return_value int+EXEC @return_value =[dbo].[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLSELECT =eGOReturn_value' 

Gå derefter til fanen Tidsplan → Klik på Ny knap nederst → vinduet med nyt jobplan åbnes. Indtast navnet ="Bestil månedlig tidsplan" og indtast følgende detaljer og klik på OK → Klik igen på OK i vinduet Nyt job.

Jobbet ville blive oprettet med succes.

Test SQL-jobbet:

Slet alle filerne i den delte mappe til test.

Sådan køres jobbet manuelt til test:Højreklik på det nyoprettede job → Klik på 'Start job ved trin..', og vi kan se jobbet køre

Vi kan se, at filen er oprettet i den delte mappe.

Bemærk:Følg venligst ovenstående trin for også at oprette SQL-jobbet (Orders_Monthly_Import) til import.

Jeg håber, at du nu har en bedre forståelse af, hvordan du bruger BCP-værktøjet.

Nyttigt værktøj:

dbForge Data Pump – et SSMS-tilføjelsesprogram til at fylde SQL-databaser med eksterne kildedata og migrere data mellem systemer.


  1. SQL Server 2016:sys.dm_exec_function_stats

  2. Eksport af din database til overførsel

  3. MariaDB JSON_QUOTE() Forklaret

  4. Postgresql Aktuelt tidsstempel på opdatering