Помощната програма 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 бази данни с външни изходни данни и мигриране на данни между системите.