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 = '''example@sqldat.com+'''
,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.