Menurut Wikipedia, "Insert Massal adalah proses atau metode yang disediakan oleh sistem manajemen basis data untuk memuat beberapa baris data ke dalam tabel basis data." Jika kita menyesuaikan penjelasan ini sesuai dengan pernyataan BULK INSERT, penyisipan massal memungkinkan mengimpor file data eksternal ke SQL Server. Asumsikan bahwa organisasi kami memiliki file CSV 1.500.000 baris dan kami ingin mengimpor file ini ke tabel tertentu di SQL Server, sehingga kami dapat dengan mudah menggunakan pernyataan BULK INSERT di SQL Server. Tentu saja, kita dapat menemukan beberapa metodologi impor untuk menangani proses impor file CSV ini, mis. kita dapat menggunakan bcp (b ulk c salin p rogram), SQL Server Import and Export Wizard atau paket Layanan Integrasi SQL Server. Namun, pernyataan BULK INSERT jauh lebih cepat dan kuat daripada menggunakan metodologi lain. Keuntungan lain dari pernyataan penyisipan massal adalah ia menawarkan beberapa parameter yang membantu menentukan pengaturan proses penyisipan massal.
Pada awalnya, kita akan memulai sampel yang sangat mendasar dan kemudian kita akan melalui berbagai skenario yang rumit.
Persiapan
Sebelum memulai sampel, kita memerlukan file CSV sampel. Oleh karena itu, kami akan mengunduh contoh file CSV dari situs web E for Excel, tempat Anda dapat menemukan berbagai contoh file CSV dengan nomor baris yang berbeda. Anda dapat menemukan tautannya di akhir artikel. Dalam skenario kami, kami akan menggunakan 1.500.000 Catatan Penjualan. Unduh file zip kemudian unzip file CSV, dan letakkan di drive lokal Anda.
Impor File CSV ke tabel SQL Server
Skenario-1:File tujuan dan CSV memiliki jumlah kolom yang sama
Dalam skenario pertama ini, kami akan mengimpor file CSV ke tabel tujuan dalam bentuk paling sederhana. Saya menempatkan contoh file CSV saya di drive C:dan sekarang kita akan membuat tabel yang akan kita impor datanya dari file CSV.
DROP TABLE IF EXISTS Sales CREATE TABLE [dbo].[Sales]( [Region] [varchar](50) , [Country] [varchar](50) , [ItemType] [varchar](50) NULL, [SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float )
Pernyataan BULK INSERT berikut mengimpor file CSV ke tabel Penjualan.
BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' );
Sekarang, kami akan menjelaskan parameter dari pernyataan penyisipan massal di atas.
Parameter FIRSTROW menentukan titik awal dari pernyataan insert. Pada contoh di bawah ini, kami ingin melewatkan header kolom sehingga kami menetapkan parameter ini ke 2.
FIELDTERMINATOR mendefinisikan karakter yang memisahkan bidang satu sama lain. SQL Server mendeteksi setiap bidang sedemikian rupa. ROWTERMINATOR tidak jauh berbeda dengan FIELDTERMINATOR. Ini mendefinisikan karakter pemisahan baris. Dalam contoh file CSV, fieldterminator sangat jelas dan ini adalah koma (,). Tapi bagaimana kita bisa mendeteksi terminator lapangan? Buka file CSV di Notepad++ lalu arahkan ke View->Show Symbol->Show All Charters, lalu cari tahu karakter CRLF di akhir setiap kolom.
CR =Pengembalian Kereta dan LF =Umpan Garis. Mereka digunakan untuk menandai jeda baris dalam file teks dan ditandai dengan karakter “\n” dalam pernyataan penyisipan massal.
Metode lain untuk mengimpor file CSV ke tabel dengan bantuan penyisipan massal menggunakan parameter FORMAT. Harap dicatat bahwa parameter FORMAT hanya tersedia di SQL Server 2017 dan versi yang lebih baru.
BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FORMAT='CSV' , FIRSTROW = 2);
Sekarang kita akan menganalisis skenario lain.
Skenario-2:Tabel tujuan memiliki lebih banyak kolom daripada file CSV
Dalam skenario ini, kami akan menambahkan kunci utama ke tabel Penjualan dan kasus ini memecah pemetaan kolom kesetaraan. Sekarang, kita akan membuat tabel Penjualan dengan kunci utama, coba impor file CSV melalui perintah penyisipan massal, dan kemudian kita akan mendapatkan kesalahan.
DROP TABLE IF EXISTS Sales CREATE TABLE [dbo].[Sales]( Id INT PRIMARY KEY IDENTITY (1,1), [Region] [varchar](50) , [Country] [varchar](50) , [ItemType] [varchar](50) NULL, [SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float ) BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' );
Untuk mengatasi kesalahan ini, kami akan membuat tampilan tabel Penjualan dengan memetakan kolom ke file CSV dan mengimpor data CSV melalui tampilan ini ke tabel Penjualan.
DROP VIEW IF EXISTS VSales GO CREATE VIEW VSales AS SELECT Region , Country , ItemType , SalesChannel , OrderPriority , OrderDate , OrderID , ShipDate , UnitsSold , UnitPrice , UnitCost , TotalRevenue, TotalCost, TotalProfit from Sales GO BULK INSERT VSales FROM 'C:\1500000 Sales Records.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' );
Skenario-3:Bagaimana cara memisahkan dan memuat file CSV menjadi ukuran batch kecil?
SQL Server memperoleh kunci ke tabel tujuan selama operasi penyisipan massal. Secara default, jika Anda tidak menyetel parameter BATCHSIZE, SQL Server membuka transaksi dan memasukkan seluruh data CSV ke dalam transaksi ini. Namun, jika Anda menetapkan parameter BATCHSIZE, SQL Server membagi data CSV menurut nilai parameter ini. Dalam contoh berikut, kami akan membagi seluruh data CSV menjadi beberapa set masing-masing 300.000 baris. Dengan demikian data akan diimpor sebanyak 5 kali.
DROP TABLE IF EXISTS Sales CREATE TABLE [dbo].[Sales]( [Region] [varchar](50) , [Country] [varchar](50) , [ItemType] [varchar](50) NULL, [SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float ) BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' , batchsize=300000 );
Jika pernyataan penyisipan massal Anda tidak menyertakan parameter ukuran batch (BATCHSIZE), kesalahan akan terjadi, dan SQL Server akan mengembalikan seluruh proses penyisipan massal. Di sisi lain, jika Anda menetapkan parameter ukuran batch ke pernyataan penyisipan massal, SQL Server akan mengembalikan hanya bagian yang terbagi ini di mana kesalahan terjadi. Tidak ada nilai optimal atau terbaik untuk parameter ini karena nilai parameter ini dapat diubah sesuai dengan kebutuhan sistem database Anda.
Skenario-4:Cara membatalkan proses impor saat mendapatkan kesalahan?
Dalam beberapa skenario penyalinan massal, jika terjadi kesalahan, kami mungkin ingin membatalkan proses penyalinan massal atau melanjutkan proses. Parameter MAXERRORS memungkinkan kita untuk menentukan jumlah kesalahan maksimum. Jika proses penyisipan massal mencapai nilai kesalahan maksimum ini, operasi impor massal akan dibatalkan dan dibatalkan. Nilai default untuk parameter ini adalah 10.
Dalam contoh berikut, kami akan dengan sengaja merusak tipe data dalam 3 baris file CSV dan menyetel parameter MAXERRORS ke 2. Akibatnya, seluruh operasi penyisipan massal akan dibatalkan karena jumlah kesalahan melebihi parameter kesalahan maksimum.
DROP TABLE IF EXISTS Sales CREATE TABLE [dbo].[Sales]( [Region] [varchar](50) , [Country] [varchar](50) , [ItemType] [varchar](50) NULL, [SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [Order Date] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float ) BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' , MAXERRORS=2);
Sekarang kita akan mengubah parameter kesalahan maksimum menjadi 4. Akibatnya, pernyataan penyisipan massal akan melewati baris ini dan menyisipkan baris terstruktur data yang tepat, dan menyelesaikan proses penyisipan massal.
DROP TABLE IF EXISTS Sales CREATE TABLE [dbo].[Sales]( [Region] [varchar](50) , [Country] [varchar](50) , [ItemType] [varchar](50) NULL, [SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [Order Date] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float ) BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' , MAXERRORS=4); SELECT COUNT(*) AS [NumberofImportedRow] FROM Sales
Selain itu, jika kita menggunakan keduanya, ukuran batch dan parameter kesalahan maksimum pada saat yang sama, proses penyalinan massal tidak akan membatalkan seluruh operasi penyisipan, itu hanya akan membatalkan bagian yang dibagi.
DROP TABLE IF EXISTS Sales CREATE TABLE [dbo].[Sales]( [Region] [varchar](50) , [Country] [varchar](50) , [ItemType] [varchar](50) NULL, [SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [Order Date] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float ) BULK INSERT Sales FROM 'C:\1500000 Sales Records.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n' , MAXERRORS=2, BATCHSIZE=750000); GO SELECT COUNT(*) AS [NumberofImportedRow] FROM Sales
Di bagian pertama dari seri artikel ini, kami membahas dasar-dasar penggunaan operasi penyisipan massal di SQL Server dan menganalisis beberapa skenario yang mendekati masalah kehidupan nyata.
Sisipan Massal SQL Server – Bagian 2
Tautan yang berguna:
Sisipan massal
E untuk Excel – Contoh File CSV / Kumpulan Data untuk Pengujian (hingga 1,5 Juta Catatan)
Unduh Notepad++
Alat yang berguna:
dbForge Data Pump – add-in SSMS untuk mengisi database SQL dengan data sumber eksternal dan memigrasikan data antar sistem.