Utilitas BCP (Bulk Copy Program) di SQL Server memungkinkan administrator database untuk mengimpor data ke dalam tabel dan mengekspor data dari tabel ke file datar. Utilitas BCP juga mendukung berbagai fitur yang memfasilitasi proses ekspor dan impor data massal.
Sekarang mari kita mulai dengan skenario bisnis.
Skenario Bisnis
Katakanlah, kita perlu membagikan laporan bulanan dalam format khusus kepada klien di lokasi bersama yang aman seperti SFTS, yaitu pada awal setiap bulan, kita perlu mengirim file ke klien untuk bulan sebelumnya. Dalam skenario ini, kami akan mencoba membuat prosedur tersimpan untuk menghasilkan data dan mengekspor data tersebut ke file datar (.txt atau .csv).
Bagaimana cara mengimpor dan mengekspor data SQL?
Ada beberapa cara untuk melakukannya:
- Menggunakan SSMS, Jalankan Kueri di jendela Kueri dan ekspor atau wizard impor &ekspor SQL Server.
- Menggunakan SSIS – Membuat paket menggunakan SSDT.
- Menggunakan SSRS.
- Menggunakan C# – Buat konsol atau menangkan Aplikasi untuk mengekspor.
- Utilitas BCP.
- dst.
Apa itu Utilitas BCP?
Utilitas BCP (Bulk copy program) adalah utilitas baris perintah untuk menyalin data antara instance MS SQL Server dan file data dalam format yang ditentukan pengguna. Kami dapat mengekspor dan mengimpor data dalam jumlah besar masuk dan keluar dari database SQL Server dengan cepat dan mudah.
Utilitas BCP melakukan tugas-tugas berikut:
- Ekspor data massal dari tabel SQL Server ke file data.
- Ekspor data massal dari kueri/Prosedur Tersimpan.
- Impor data massal dari file data ke tabel SQL Server.
- Pembuatan format file.
Anda dapat menemukan detail lebih lanjut tentang Utilitas BCP di sini.
Lingkungan yang digunakan
- Edisi Pengembang SQL Server 2017
- Studio manajemen SQL server 2017
- Contoh database Importir Seluruh Dunia v1.0
- Utilitas BCP
Cara Mengekspor data ke file datar
Buat prosedur Tersimpan untuk menghasilkan data laporan bulanan.
Pertama, buat objek dependen untuk prosedur Stored export.
Jadi kita harus membuat tabel berikut:
- The Orders_Monthly_Temp_Table tabel:tabel sementara ini digunakan untuk menyimpan data pesanan bulanan dalam format tertentu untuk mengekspornya ke file teks yaitu dalam kasus kami menggabungkan semua kolom menjadi satu baris dengan pembatas “|”.
- Export_Config tabel:tabel ini digunakan untuk menyimpan konfigurasi ekspor yaitu jalur folder bersama, jenis file datar, pembatas.
Buat skrip untuk Orders_Monthly_Temp_Table
CREATE TABLE [dbo].[Orders_Monthly_Temp_Table]( [Row] [varchar](200) NOT NULL ) ON [PRIMARY]
Buat skrip untuk 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] PRIMARY KEY CLUSTERED ( [Exp_Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [USERDATA] ) ON [USERDATA] GO
Memasukkan data ke dalam Export_Config
SET IDENTITY_INSERT [dbo].[Export_Config] ON GO INSERT [dbo].[Export_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) VALUES (1, N'\\AASHREEPC\FileServer\OrdersMonthly', N'.txt', N'|') GO SET IDENTITY_INSERT [dbo].[Export_Config] OFF GO
Pembuatan &Parameter prosedur tersimpan
- Di sini parameter tahun dan bulan bersifat opsional.
- Jika bulan tidak ditentukan maka dibutuhkan bulan sebelumnya dan jika bulan 12 kita harus mengambil tahun sebelumnya, karena jika kita membuat laporan pada jan'2019 untuk Des'2018.
- Jika tahun tidak ditentukan, dibutuhkan tahun berjalan Dan jalur Folder Wajib.
CREATE PROCEDURE [dbo].[Orders_Monthly_Report] @Month INT = NULL ,@Year INT = NULL ,@FolderPath VARCHAR(200) AS BEGIN SET NOCOUNT ON; BEGIN TRY
Validasi Parameter
--#region Parametes validation 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 'ERROR FolderPath must be specified.' RETURN; END --#endregion Parameters validation
Dapatkan konfigurasi dari tabel ekspor
DECLARE @ExportPath VARCHAR(200) ,@Delimiter CHAR(1) ,@FileType VARCHAR(5) SELECT @ExportPath = TRIM(ShareFolder) ,@FileType = TRIM(FileType) ,@Delimiter = TRIM(Delimiter) FROM dbo.Export_Config
Mendapatkan tanggal mulai dan tanggal akhir bulan
DECLARE @MonthStartDate DATETIME = DATEADD(month, @Month - 1, DATEADD(year, @Year - 1900, 0)) ,@MonthEndDate DATETIME = DATEADD(day, - 1, DATEADD(month, @Month, DATEADD(year, @Year - 1900, 0))) Check and Create the temporary table for report data/result IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Orders_Monthly_Temp_Table]') AND type IN (N'U') ) BEGIN CREATE TABLE [dbo].Orders_Monthly_Temp_Table ([Row] [varchar](200) NOT NULL) ON [PRIMARY] END
Masukkan data ke dalam tabel temp dalam format tertentu yaitu dalam hal ini “| – simbol pipa dipisahkan”
TRUNCATE TABLE Orders_Monthly_Temp_Table INSERT INTO Orders_Monthly_Temp_Table SELECT CAST([OrderID] AS VARCHAR(10)) + ' | ' + CAST(c.[CustomerName] AS VARCHAR(50)) + ' | ' + CAST(p.[FullName] AS VARCHAR(50)) + ' | ' + ISNULL(CAST([PickedByPersonID] AS VARCHAR(4)), '') + ' | ' + CAST(p.[FullName] AS VARCHAR(20)) + ' | ' + ISNULL(CAST([BackorderOrderID] AS VARCHAR(4)), '') + ' | ' + CAST([OrderDate] AS VARCHAR(20)) + ' | ' + CAST([ExpectedDeliveryDate] AS VARCHAR(20)) + ' | ' + CAST([CustomerPurchaseOrderNumber] AS VARCHAR(10)) + ' | ' + CAST([IsUndersupplyBackordered] AS VARCHAR(4)) + ' | ' + ISNULL(CAST([Comments] AS VARCHAR(50)), '') + ' | ' + ISNULL(CAST([DeliveryInstructions] AS VARCHAR(50)), '') + ' | ' + ISNULL(CAST([InternalComments] AS VARCHAR(50)), '') + ' | ' + CAST([PickingCompletedWhen] AS VARCHAR(20)) + ' | ' + CAST(o.[LastEditedBy] AS VARCHAR(4)) + ' | ' + CAST([LastEditedWhen] AS VARCHAR(20)) AS Row FROM [WideWorldImporters].[Sales].[Orders] o INNER JOIN [Sales].[Customers] c ON o.[CustomerID] = c.[CustomerID] INNER JOIN [Application].[People] p ON o.[SalespersonPersonID] = p.[PersonID] WHERE OrderDate BETWEEN @MonthStartDate AND @MonthEndDate
Kode untuk mengekspor data ke file datar
Buat folder jika tidak ada Menggunakan SQL xp_create_subdir
DECLARE @sql VARCHAR(8000) ,@FilePath VARCHAR(200) ,@Query VARCHAR(100) DECLARE @file_results TABLE ( file_exists INT ,file_is_a_directory INT ,parent_directory_exists INT ) SET @FolderPath = @FolderPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' INSERT INTO @file_results EXEC MASTER.dbo.xp_fileexist @FolderPath IF NOT EXISTS ( SELECT 1 FROM @file_results WHERE file_is_a_directory = 1 ) EXEC MASTER.dbo.xp_create_subdir @FolderPath
Membuat file di folder bersama
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 ' --+ @@servername EXEC master..xp_cmdshell @sql END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_STATE() AS ErrorState ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; END CATCH SET NOCOUNT OFF; END
Ubah konteks direktori Anda ke folder tempat BPC Utility berada
[id tabel=58 /]
Melaksanakan prosedur
DECLARE @return_value int EXEC @return_value = [dbo].[Exp_Orders_Monthly_Report] @Month = NULL, @Year = NULL, @FolderPath = NULL SELECT 'Return Value' = @return_value GO
Keluaran
Folder tujuan
File Datar Sebenarnya (.txt/.cvs)
Folder bersama harus memiliki Izin ke Akun Virtual “NT SERVICE\MSSQLSERVER”
Klik kanan file atau folder yang ingin Anda atur izinnya → Klik Properties → Klik tab Security. → Klik Edit → Klik Tambah → Ketik NT SERVICE\MSSQLSERVER di kotak nama objek. (jangan klik “Check Names” – jika anda klik Check Names bisa saja anda mendapatkan error 'Sebuah objek bernama “NT SERVICE\MSSQLSERVER” tidak dapat ditemukan.) → Klik OK → pilih akun MSSQLSERVER → Tambahkan izin ( Kontrol penuh) yang diperlukan untuk akun MSSQLSERVER:
Aktifkan 'xp_cmdshell' SQL Server
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'xp_cmdshell', 1 GO RECONFIGURE GO
Cara Mengimpor Data dari Flat file
Dalam contoh ini, kami menggunakan Sisipkan Massal untuk mengimpor data dari file. Kita juga bisa menggunakan Openrowset dll.
Buat prosedur Tersimpan untuk Mengimpor data dari file datar di folder Bersama.
Pertama, buat objek dependen untuk prosedur impor Tersimpan.
Jadi kita harus membuat tabel berikut
- Pesanan_Bulanan table:tabel ini digunakan untuk menyimpan data pesanan bulanan dari flat file.
- Import_Config tabel: tabel ini digunakan untuk menyimpan konfigurasi impor yaitu jalur folder bersama, jenis file datar, pembatas.
CREATE TABLE [dbo].[Orders_Monthly]( [OrderID] [int] NOT NULL, [CustomerName] [varchar](50) NOT NULL, [SalespersonPersonName] [varchar](50) NOT NULL, [PickedByPersonName] [varchar](50) NULL, [ContactPersonName] [varchar](50) NOT NULL, [BackorderOrderID] [varchar](4) NULL, [OrderDate] [date] NOT NULL, [ExpectedDeliveryDate] [date] NOT NULL, [CustomerPurchaseOrderNumber] [nvarchar](20) NULL, [IsUndersupplyBackordered] [bit] NOT NULL, [Comments] [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] PRIMARY KEY CLUSTERED ( [OrderID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [USERDATA] ) ON [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 ) ON [USERDATA] GO
Memasukkan data ke dalam Import_Config
SET IDENTITY_INSERT [dbo].[Import_Config] ON GO INSERT [dbo].[Import_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) VALUES (1, N'\\AASHREEPC\FileServer\OrdersMonthly', N'.txt', N'|') GO SET IDENTITY_INSERT [dbo].[Import_Config] OFF GO
Pembuatan &Parameter prosedur tersimpan
Sama seperti dalam prosedur Tersimpan ekspor.
CREATE PROCEDURE [dbo].[Imp_Orders_Monthly_Report] @Month INT = NULL ,@Year INT = NULL ,@FolderPath VARCHAR(200) = NULL AS BEGIN SET NOCOUNT ON; BEGIN TRY Get the configuration from the import table DECLARE @ImportPath VARCHAR(200) ,@Delimiter CHAR(1) ,@FileType VARCHAR(5) ,@FilePath VARCHAR(200) SELECT @ImportPath = TRIM(ShareFolder) ,@FileType = TRIM(FileType) ,@Delimiter = TRIM(Delimiter) FROM dbo.Import_Config
Validasi Parameter
Sama seperti dalam prosedur Tersimpan ekspor.
SET @FolderPath = @ImportPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\' END ELSE BEGIN --SELECT @FolderPath = '\\AASHREEPC\FileServer\OrdersMonthly' SELECT 'ERROR FolderPath must be specified.' RETURN; END END --#endregion Parametes validation
Periksa apakah file tersebut ada atau tidak
CREATE TABLE #File ( FileName SYSNAME ,Depth 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 does not exists' RETURN; END DROP TABLE #File Import the data from the shared folder using Bulk Insert DECLARE @SQL_BULK VARCHAR(MAX) DecLare @Errorlog varchar (Max) = @FolderPath + '\Error.log' SET @SQL_BULK = 'BULK INSERT [Orders_Monthly] FROM ''' + @FilePath + ''' WITH ( DATAFILETYPE = ''char'' ,BATCHSIZE = 50000 ,CODEPAGE = ''RAW'' ,FIRSTROW = 1 ,FIELDTERMINATOR = '''[email protected]+''' ,ROWTERMINATOR = ''\n'' ,KEEPNULLS ,ERRORFILE = '''+ @Errorlog + ''' ,MAXERRORS = 20000 ,TABLOCK )' EXEC (@SQL_BULK) END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_STATE() AS ErrorState ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; END CATCH SET NOCOUNT OFF; END
Melaksanakan prosedur
DECLARE @return_value int EXEC @return_value = [dbo].[Imp_Orders_Monthly_Report] @Month = NULL, @Year = NULL, @FolderPath = NULL SELECT 'Return Value' = @return_value GO
Keluaran
Verifikasi
Mengotomatiskan proses:
Untuk menjalankan proses ekspor dan impor secara otomatis dalam waktu yang dijadwalkan. katakanlah kita perlu menjalankan ekspor pada hari pertama setiap bulan pada pukul 12:00 setiap bulan untuk laporan bulan terakhir dan menjalankan impor nanti. Jadi kita perlu membuat SQL Job untuk itu.
Langkah-langkah untuk membuat Pekerjaan SQL untuk Ekspor dan impor.
- Buka MS SQL Server Management Studio →
- dan Anda harus memiliki “SQL Server Agent” →
- Perluas “SQL Server Agent” pada Object Explorer. →
- Klik kanan JOB dan pilih “Pekerjaan Baru…” →
- Anda dapat melihat jendela “Pekerjaan Baru” dan memasukkan nama =“Orders_Monthly_Export” &Deskripsi
Kemudian masuk ke tab Steps → Klik New Button di bagian bawah → jendela Job Steps baru terbuka → Masukkan Name =“execute [Exp_Orders_Monthly_Report] SP” dan Type =“Transact-SQL Script (T-SQL)” → Paste script berikut di area teks Perintah dan Klik OK.
USE [WideWorldImporters] GO DECLARE @return_value int+ EXEC @return_value = [dbo].[Exp_Orders_Monthly_Report] @Month = NULL, @Year = NULL, @FolderPath = NULL SELECT 'Return Value' = @return_value GO
Kemudian Buka tab Jadwal → Klik Tombol Baru di bagian bawah → jendela Jadwal pekerjaan baru terbuka. Masukkan Name =“Order Monthly Schedule” dan masukkan detail berikut dan Klik OK → Sekali lagi Klik OK di jendela New Job.
Pekerjaan akan berhasil dibuat.
Uji Pekerjaan SQL:
Hapus semua file di folder Bersama untuk pengujian.
Untuk menjalankan pekerjaan secara manual untuk pengujian:Klik Kanan pada Pekerjaan yang Baru dibuat → Klik ‘Mulai Pekerjaan pada langkah..’ dan kita dapat melihat pekerjaan yang sedang berjalan
Kita bisa melihat file tersebut dibuat di folder Shared.
Catatan:Ikuti langkah-langkah di atas untuk membuat tugas SQL (Orders_Monthly_Import) untuk Impor juga.
Saya harap sekarang Anda memiliki pemahaman yang lebih baik tentang cara menggunakan utilitas BCP.
Alat yang berguna:
dbForge Data Pump – add-in SSMS untuk mengisi database SQL dengan data sumber eksternal dan memigrasikan data antar sistem.