Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Sisipan Massal SQL Server – Bagian 1

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memeriksa Tingkat Kompatibilitas Database di SQL Server menggunakan T-SQL

  2. Instalasi Cluster Failover SQL Server -2

  3. sql geografi ke dbgeografi?

  4. Prosedur Tersimpan Panggilan SQL untuk setiap Baris tanpa menggunakan kursor

  5. Versi backend tidak didukung untuk mendesain diagram atau tabel database