Database
 sql >> база данни >  >> RDS >> Database

Как да експортирате данни в плосък файл с помощта на BCP и да импортирате данни с групово вмъкване

Помощната програма BCP (Програма за групово копиране) в SQL Server позволява на администраторите на бази данни да импортират данни в таблица и да експортират данни от таблица в плосък файл. Помощната програма BCP също така поддържа различни функции, които улесняват процеса на експортиране и импортиране на групови данни.

Сега нека започнем с бизнес сценарий.

Бизнес сценарий

Да кажем, че трябва да споделим месечен отчет в конкретния формат на клиент в защитено споделено местоположение като SFTS, т.е. в началото на всеки месец, трябва да изпратим файла на клиент за предходния месец. В този сценарий ще се опитаме да създадем съхранената процедура за генериране на данни и експортиране на тези данни в плосък файл (.txt или .csv).

Как да импортирам и експортирам SQL данните?

Има няколко начина да направите това:

  • Използвайки SSMS, стартирайте заявката в прозореца на заявката и експортирайте или съветника за импортиране и експортиране на SQL Server.
  • Използване на SSIS – Създаване на пакет с помощта на SSDT.
  • Използване на SSRS.
  • Използване на C# – Създаване на конзолно или спечелено приложение за експортиране.
  • Помощна програма BCP.
  • и др.

Какво е BCP Utility?

Помощната програма BCP (програма за групово копиране) е помощна програма от командния ред за копиране на данни между екземпляр на MS SQL Server и файл с данни в определен от потребителя формат. Можем да експортираме и импортираме големи количества данни във и от базите данни на SQL Server бързо и лесно.

Помощната програма BCP изпълнява следните задачи:

  • Групово експортиране на данни от таблица на SQL Server във файл с данни.
  • Групово експортиране на данни от заявка/съхранена процедура.
  • Групово импортиране на данни от файл с данни в таблица на SQL Server.
  • Генериране на файлове с формат.

Можете да намерите повече подробности за BCP Utility тук.

Използвана среда

  • Издание за разработчици на SQL Server 2017
  • Студио за управление на SQL сървър 2017
  • Примерна база данни на Wide World Importers v1.0
  • Помощна програма BCP

Как да експортирате данни в плосък файл

Създайте съхранена процедура, за да генерирате данните за месечния отчет.

Първо, създайте зависимите обекти за експортираната Съхранена процедура.

Така че трябва да създадем следните таблици:

  • Поръчките_Месечна_Времена_Таблица таблица:тази временна таблица се използва за съхраняване на данните за месечните поръчки в определен формат, за да ги експортирате в текстов файл, т.е. в нашия случай конкатенирането на всички колони в един ред с разделител „|“.
  • Export_Config таблица:тази таблица се използва за съхраняване на конфигурации за експортиране, т.е. път на споделена папка, плосък тип файл, разделител.

Създайте скрипт за Orders_Monthly_Temp_Table

СЪЗДАВАНЕ НА ТАБЛИЦА [dbo].[Orders_Monthly_Temp_Table]( [Row] [varchar](200) НЕ НУЛИ) НА [PRIMARY]

Създайте скрипт за Export_Config

СЪЗДАДЕТЕ ТАБЛИЦА [dbo].[Export_Config]( [Exp_Id] [int] IDENTITY(1,1) НЕ NULL, [ShareFolder] [varchar](200) НЕ NULL, [FileType] [varchar](5) НЕ НЕ. NULL, [Разделител] [char](1) НЕ NULL, ОГРАНИЧЕНИЕ [PK_Export_Config] ПЪРВИЧЕН КЛУСТРИРОВАН ( [Exp_Id] ASC) С (PAD_INDEX =ИЗКЛЮЧЕНО, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEONALLY =OFF, OFF, OFF, OFF) [USERDATA]) НА [USERDATA]GO

Вмъкнете данни в Export_Config

ЗАДАДЕТЕ IDENTITY_INSERT [dbo].[Export_Config] ON GOINSERT [dbo].[Export_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) СТОЙНОСТИ (1, N'\\AASHREEPC\FileServer\\\FileServer\). Поръчки Месечно', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo].[Export_Config] OFFGO

Създаване и параметри на съхранена процедура

  • Тук параметрите за година и месец са по избор.
  • Ако месец не е посочен, той отнема предходния месец, а ако месецът е 12, трябва да вземем предходната година, защото ако генерираме отчета през януари 2019 г. за декември 2018 г.
  • Ако година не е посочена, тя отнема текущата година и пътят към папката е задължителен.
СЪЗДАВАНЕ НА ПРОЦЕДУРА [dbo].[Orders_Monthly_Report] @Month INT =NULL ,@Year INT =NULL ,@FolderPath VARCHAR(200) ASBEGIN SET NOCOUNT ON; ЗАПОЧНЕТЕ ОПИТ

Проверка на параметри

--#region Валидиране на параметри IF NULLIF(@Month, '') IS NULL BEGIN SELECT @Month =DATEPART(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' SELECT 'ГРЕШКА FolderPath трябва да бъде указан.' ВРЪЩАНЕ; КРАЙ --#endregion Валидиране на параметри

Вземете конфигурацията от таблицата за експортиране

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

Получаване на начална и крайна дата на месеца

ДЕКЛАРИРАНЕ @MonthStartDate DATETIME =DATEADD(месец, @Month - 1, DATEADD(година, @Year - 1900, 0)) ,@MonthEndDate DATETIME =DATEADD(ден, - 1, DATEADD(месец, @DADDMonth, ДАТА година, @Year - 1900, 0)))Проверете и създайте временната таблица за отчетни данни/резултат АКО НЕ СЪЩЕСТВУВА ( SELECT * FROM sys.objects WHERE object_id =OBJECT_ID(N'[dbo].[Orders_Monthly_Temp_Table]') И въведете IN IN въведете IN. (N'U') ) ЗАПОЧНЕТЕ СЪЗДАВАТЕ ТАБЛИЦА [dbo].Orders_Monthly_Temp_Table ([Row] [varchar](200) НЕ НУЛЕВО) НА [ОСНОВНО] END

Вмъкнете данните във временната таблица в определен формат, т.е. в този случай „| – разделен символ на тръбата”

ОТРЕЗИ ТАБЛИЦА Поръчки_Monthly_Temp_Table INSERT INTO Orders_Monthly_Temp_Table SELECT CAST([OrderID] AS VARCHAR(10)) + ' | ' + CAST(c.[Име на клиента] КАТО VARCHAR(50)) + ' | ' + CAST(p.[Пълно име] КАТО VARCHAR(50)) + ' | ' + ISNULL(CAST([PickedByPersonID] КАТО VARCHAR(4)), '') + ' | ' + CAST(p.[Пълно име] КАТО VARCHAR(20)) + ' | ' + ISNULL(CAST([BackorderOrderID] КАТО VARCHAR(4)), '') + ' | ' + CAST([Дата на поръчката] КАТО VARCHAR(20)) + ' | ' + CAST([Очаквана дата на доставка] КАТО VARCHAR(20)) + ' | ' + CAST([CustomerPurchaseOrderNumber] КАТО VARCHAR(10)) + ' | ' + CAST([IsUndersupplyBackordered] КАТО VARCHAR(4)) + ' | ' + ISNULL(CAST([Коментари] КАТО VARCHAR(50)), '') + ' | ' + ISNULL(CAST([Инструкции за доставка] КАТО VARCHAR(50)), '') + ' | ' + ISNULL(CAST([Вътрешни коментари] КАТО VARCHAR(50)), '') + ' | ' + CAST([PickingCompletedWhen] КАТО VARCHAR(20)) + ' | ' + CAST(o.[LastEditedBy] КАТО VARCHAR(4)) + ' | ' + CAST([LastEditedWhen] AS VARCHAR(20)) КАТО ред ОТ [WideWorldImporters].[Продажби].[Поръчки] o INNER JOIN [Продажби].[Клиенти] c ON o.[CustomerID] =c.[CustomerID] INNER JOIN [Приложение].[Хора] p ON o.[SalespersonPersonID] =p.[PersonID] КЪДЕ Дата на поръчка МЕЖДУ @MonthStartDate И @MonthEndDate

Код за експортиране на данните в плосък файл

Създайте папката, ако не съществува с помощта на SQL xp_create_subdir

DECLARE @sql VARCHAR(8000) ,@FilePath VARCHAR(200) ,@Query VARCHAR(100) ДЕКЛАРИРАНЕ на @file_results TABLE ( file_exists INT ,file_is_a_directory INT ,parent_directory_a_directory INT ,parent_directory_parent_exists @ASTFder'Path SET (@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' INSERT INTO @file_results EXEC MASTER.dbo.xp_fileexist @FolderPath АКО НЕ СЪЩЕСТВУВА (ИЗБЕРЕТЕ 1 result ОТ @file_results file_is_a_directory =1 ) EXEC MASTER.dbo.xp_create_subdir @FolderPath

Създаване на файла в споделената папка

SET @FilePath ='"' + @FolderPath + '' + 'Orders_Monthly' + '_' + ( SELECT Format(GETDATE(), N'yyyyMMddHHmmss') + '.txt"' SET @Query =' "SELECT * от ' + ( 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 ' --+ @@servername EXEC master..xp_cmdshell @sql КРАЙ ОПИТ BEGIN CATCH SELECT ERROR_NUMBER() КАТО ErrorNumber ,ERROR_STATE() КАТО ErrorState ,ERROR_SEVERITY() КАТО ErrorSeverity ,ERROR_PROCEDURE() КАТО ErrorProcedure ,ERROR_LINE() КАТО ErrorLine ,ERROR_MESSAGE() КАТО ErrorMessage; END CATCH SET NOCOUNT OFF;END

Променете контекста на вашата директория към папката, където се намира BPC Utility

[table id=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 в полето за име на обекта. (не щракайте върху „Проверка на имената“ – ако щракнете върху Проверка на имената, може да се случи да получите грешка „Обект с име „NT SERVICE\MSSQLSERVER“ не може да бъде намерен.) → Щракнете върху OK → изберете акаунта на MSSQLSERVER → Добавяне на разрешения ( Пълен контрол), които са необходими за акаунта на MSSQLSERVER:

Активиране на „xp_cmdshell“ SQL сървър

EXEC sp_configure 'показване на разширени опции', 1GORECONFIGUREGOEXEC sp_configure 'xp_cmdshell', 1GORECONFIGUREGO

Как да импортирам данни от плосък файл

В този пример използваме групово вмъкване за импортиране на данни от файла. Можем също да използваме Openrowset и др.

Създайте съхранена процедура, за да импортирате данните от плосък файл в споделена папка.

Първо, създайте зависимите обекти за импортираната Съхранена процедура.

Така че трябва да създадем следните таблици

  • Поръчки_Месечно таблица:тази таблица се използва за съхраняване на данните за месечните поръчки от плоския файл.
  • Import_Config таблица: тази таблица се използва за съхраняване на конфигурации за импортиране, т.е. път на споделена папка, плосък тип файл, разделител.

CREATE TABLE [dbo].[Orders_Monthly]( [OrderID] [int] NOT NULL, [CustomerName] [varchar](50) NOT NULL, [SalespersonPersonName] [varchar](50) NOT NULL, [PickedByPersonName] [PickedByPersonName] varchar](50) NULL, [ContactPersonName] [varchar](50) НЕ NULL, [BackorderOrderID] [varchar](4) NULL, [OrderDate] [дата] NOT NULL, [ExpectedDeliveryDate] [дата] NOT NULL, [seOrderDate] [дата] ] [nvarchar](20) NULL, [IsUndersupplyBackordered] [bit] NOT NULL, [Коментари] [nvarchar](max) NULL, [Инструкции за доставка] [nvarchar](max) NULL, [InternalComments] [nvarchar](max) NULL , [PickingCompletedWhen] [datetime2](7) NULL, [LastEditedBy] [int] NOT NULL, [LastEditedWhen] [datetime2](7) NOT NULL, CONSTRAINT [PK_Orders_Monthly] ПЪРВИЧЕН КЛЮЧ КЛУСТРИРАН ( [Orders_WITHID] ИЗКЛ., STATISTICS_NORECOMPUTE =ИЗКЛЮЧЕНО, IGNORE_DUP_KEY =ИЗКЛЮЧЕНО, ALLOW_ROW_LOCKS =ВКЛ., ALLOW_PAGE_LOCKS =ВКЛ.) ВКЛ. [ПОЛЗ. ДАННИ]) ВКЛ. [ПОЛЗ. ДАННИ] TEXTIMAGE_ON [ПОЛЗ. ДАННИ] GO

СЪЗДАДЕТЕ ТАБЛИЦА [dbo].[Import_Config]( [Exp_Id] [int] IDENTITY(1,1) НЕ NULL, [ShareFolder] [nchar](200) НЕ NULL, [FileType] [varchar](5) НЕ НЕ. NULL, [Разделител] [char](1) НЕ NULL) В [USERDATA]GO

Вмъкнете данни в Import_Config

ЗАДАДЕТЕ IDENTITY_INSERT [dbo].[Import_Config] ON GOINSERT [dbo].[Import_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) СТОЙНОСТИ (1, N'\\AASHREEPC\\FileSerSer). Поръчки Месечно', N'.txt', N'|')GOSET IDENTITY_INSERT [dbo].[Import_Config] OFFGO

Създаване и параметри на съхранена процедура

Същото като при експортираната Съхранена процедура.

СЪЗДАВАНЕ НА ПРОЦЕДУРА [dbo].[Imp_Orders_Monthly_Report] @Month INT =NULL ,@Year INT =NULL ,@FolderPath VARCHAR(200) =NULLASBEGIN SET NOCOUNT ON; ЗАПОЧНЕТЕ ОПИТАЙТЕ Вземете конфигурацията от таблицата за импортиранеDECLARE @ImportPath VARCHAR(200) ,@Delimiter CHAR(1) ,@FileType VARCHAR(5) ,@FilePath VARCHAR(200) SELECT @ImportPath =TRIM(ShareFileTpeyleTe @FileFolder) ) ,@Delimiter =TRIM(Delimiter) FROM dbo.Import_Config

Проверка на параметри

Същото като при експортираната Съхранена процедура.

ЗАДАДЕТЕ @FolderPath =@ImportPath + '\' + CAST(@Година КАТО VARCHAR(10)) + '\' + CAST(@Месец КАТО VARCHAR(10)) + '\' КРАЙ ДРУГА ЗАПОЧНЕТЕ --SELECT @ FolderPath ='\\AASHREEPC\FileServer\OrdersMonthly' SELECT 'ГРЕШКА FolderPath трябва да бъде посочен.' ВРЪЩАНЕ; КРАЙ КРАЙ --#endregion Валидиране на параметри

Проверете дали файлът съществува или не

СЪЗДАВАНЕ НА ТАБЛИЦА #Файл (Име на файл SYSNAME ,Дълбочина TINYINT ,IsFile TINYINT ); INSERT INTO #File ( FileName ,Depth ,IsFile ) EXEC xp_DirTree @FolderPath ,1 ,1 SELECT TOP 1 @FilePath =@FolderPath + '\' + FileName ОТ #File ORDER BY FileName DESC; IF NULLIF((ИЗБЕРЕТЕ TOP 1 FileName FROM #File ORDER BY FileName DESC), '') IS NULL BEGIN SELECT 'ERROR import File does not exist' RETURN; END DROP TABLE #FileИмпортирайте данните от споделената папка с помощта на Bulk InsertDECLARE @SQL_BULK VARCHAR(MAX) DecLare @Errorlog varchar (Max) =@FolderPath + '\Error.log' SET @SQL_BULK ='Orders INSERT на [thi] FROM ' + @FilePath + ''' С ( DATAFILETYPE =''char'' ,BATCHSIZE =50000 ,CODEPAGE =''RAW'' ,FIRSTROW =1 ,FIELDTERMINATOR ='''[email protected]+''' ,ROWTERMINATOR =''\n'' ,KEEPNULLS ,ERRORFILE ='''+ @Errorlog + ''' ,MAXERRORS =20000 ,TABLOCK )' EXEC (@SQL_BULK)END Опитайте BEGIN CATCH SELECT ERROR_NUMBER() КАТО ErrorNumber ,ERROR_STATE() КАТО Err или ,ERROR_SEVERITY() КАТО ErrorSeverity ,ERROR_PROCEDURE() КАТО ErrorProcedure ,ERROR_LINE() КАТО ErrorLine ,ERROR_MESSAGE() КАТО Err или Съобщение; END CATCH SET NOCOUNT OFF;END

Изпълнение на процедурата

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

Изход

Проверка

Автоматизиране на процеса:

За автоматично стартиране на процеса на експортиране и импортиране в насрочено време. да кажем, че трябва да стартираме експортирането на първия ден от месеца в 12:00 часа на месеца за отчета за последния месец и да стартираме импортирането по-късно. Така че трябва да създадем SQL заданието за това.

Стъпки за създаване на SQL задание за експортиране и импортиране.

  • Отворете MS SQL Server Management Studio →
  • и трябва да имате „SQL Server Agent“ →
  • Разгънете „SQL Server Agent“ в Object Explorer. →
  • Щракнете с десния бутон на мишката JOB и изберете „Нова работа…“ →
  • Можете да видите прозореца „Нова работа“ и да въведете името =„Orders_Monthly_Export“ &Описание

След това отидете на раздела Стъпки → Щракнете върху Нов бутон в долната част → отваря се нов прозорец със стъпки на заданието → Въведете името =„изпълни [Exp_Orders_Monthly_Report] SP“ и въведете =„Transact-SQL Script (T-SQL)“ → Поставете следния скрипт в текстовата област на командата и щракнете върху OK.

ИЗПОЛЗВАЙТЕ [WideWorldImporters]GODECLARE @return_value int+EXEC @return_value =[dbo].[Exp_Orders_Monthly_Report] @Month =NULL, @Year =NULL, @FolderPath =NULLuSELECT 'Return =NULLu_ne'u>nreGOSELECTn 

След това отидете в раздела График → Щракнете върху бутона Нов в долната част → отваря се нов прозорец за график. Въведете Име =„Месечен график на поръчката“ и въведете следните подробности и Щракнете върху OK → Отново Щракнете върху OK в прозореца Нова работа.

Работата ще бъде създадена успешно.

Тествайте SQL заданието:

Изтрийте всички файлове в споделената папка за тестване.

За да стартирате заданието ръчно за тестване:Щракнете с десния бутон върху новосъздаденото задание → Щракнете върху „Стартиране на заданието на стъпка..“ и можем да видим, че заданието се изпълнява

Можем да видим, че файлът е създаден в споделена папка.

Забележка:Моля, следвайте горните стъпки, за да създадете SQL заданието (Orders_Monthly_Import) и за импортиране.

Надявам се, че сега имате по-добро разбиране как да използвате помощната програма BCP.

Полезен инструмент:

dbForge Data Pump – SSMS добавка за попълване на SQL бази данни с външни изходни данни и мигриране на данни между системите.


  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. Как да махнете таблици и колони с SQL

  3. Съвети за XML производителност

  4. Инкрементална репликация на данни в IRI Workbench

  5. Как да преброите броя на редовете в таблица в SQL