Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Gudang di Microsoft Fabric
Mengimpor file data ke dalam tabel database atau menampilkan dalam format yang ditentukan pengguna di SQL Server.
Sintaks
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' | 'native' | 'widenative' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = 'CSV' ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
-- database options
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] TABLOCK ]
-- source options
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] BATCHSIZE = batch_size ]
) ]
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'code_page' | 'ACP' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = { 'CSV' | 'PARQUET' } ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
) ]
Argumen
Pernyataan BULK INSERT memiliki argumen dan opsi yang berbeda di platform yang berbeda. Perbedaan dirangkum dalam tabel berikut:
| Fitur | SQL Server | Azure SQL Database dan Azure SQL Managed Instance | Gudang Data Fabric |
|---|---|---|---|
| Sumber data | Jalur lokal, Jalur jaringan (UNC), atau Azure Storage | Azure Storage | Azure Storage, Satu Danau |
| Autentikasi sumber | Autentikasi Windows, SAS | ID Microsoft Entra, token SAS, identitas terkelola | Microsoft Entra ID |
| Opsi yang tidak didukung |
* karakter pengganti di jalur, FORMAT = 'PARQUET' |
* karakter pengganti di jalur, FORMAT = 'PARQUET' |
DATAFILETYPE = {'native' | 'widenative'} |
| Opsi yang diaktifkan tetapi tanpa efek |
KEEPIDENTITY, , FIRE_TRIGGERS, CHECK_CONSTRAINTSTABLOCK, ORDER, ROWS_PER_BATCH, KILOBYTES_PER_BATCH, dan BATCHSIZE tidak berlaku. Mereka tidak melemparkan kesalahan sintaksis, tetapi tidak berpengaruh apa pun |
database_name
Nama database tempat tabel atau tampilan yang ditentukan berada. Jika tidak ditentukan, database_name adalah database saat ini.
schema_name
Menentukan nama tabel atau skema tampilan. schema_name bersifat opsional jika skema default untuk pengguna yang melakukan operasi impor massal adalah skema tabel atau tampilan yang ditentukan. Jika skema tidak ditentukan dan skema default pengguna yang melakukan operasi impor massal berbeda dari tabel atau tampilan yang ditentukan, SQL Server mengembalikan pesan kesalahan, dan operasi impor massal dibatalkan.
table_name
Menentukan nama tabel atau tampilan untuk mengimpor data secara massal. Hanya tampilan di mana semua kolom merujuk ke tabel dasar yang sama yang dapat digunakan. Untuk informasi selengkapnya tentang pembatasan untuk memuat data ke dalam tampilan, lihat INSERT.
DARI 'data_file'
Menentukan jalur lengkap file data yang berisi data untuk diimpor ke dalam tabel atau tampilan yang ditentukan.
BULK INSERT dapat mengimpor data dari disk atau Azure Storage (termasuk jaringan, floppy disk, hard disk, dan sebagainya).
BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
data_file harus menentukan jalur yang valid dari server tempat SQL Server berjalan. Jika data_file adalah file jarak jauh, tentukan nama Universal Naming Convention (UNC). Nama UNC memiliki formulir \\SystemName\ShareName\Path\FileName. Contohnya:
BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
Azure SQL Database dan Fabric Data Warehouse mendukung pembacaan data dari URI, tetapi tidak mendukung jalur file lokal.
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv';
Dimulai dengan SQL Server 2017 (14.x), data_file dapat berada di Azure Storage. Dalam hal ini, Anda juga perlu menentukan opsi data_source_name. Sebagai contoh, lihat Mengimpor data dari file di Azure Storage.
Fabric Data Warehouse mendukung dua gaya jalur berbeda untuk menentukan jalur sumber:
https://<storage account>.blob.core.windows.net/<container name>/<path to file>abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>
Fabric Data Warehouse mendukung * karakter pengganti yang dapat cocok dengan karakter apa pun di URI, dan memungkinkan Anda menentukan pola URI untuk file yang harus diimpor. Contohnya:
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';
Catatan
Ganti <data-lake>.blob.core.windows.net dengan URL yang sesuai.
Sumber_Data
Berlaku untuk: SQL Server 2017 (14.x) dan versi yang lebih baru, Azure SQL Database, dan Gudang di Microsoft Fabric.
Menentukan sumber data eksternal bernama yang mengarah ke lokasi akar Azure Storage untuk impor file.
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION = 'https://<data-lake>.blob.core.windows.net/public/');
Catatan
Ganti <data-lake>.blob.core.windows.net dengan URL yang sesuai.
Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL.
Jalur file dalam FROM klausa harus berupa jalur relatif, yang akan ditambahkan ke lokasi akar yang ditentukan dalam sumber data eksternal.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');
Catatan
Untuk kesederhanaan, contoh berikut menggunakan jalur relatif dan sumber data eksternal yang telah ditentukan sebelumnya.
CODEPAGE
Menentukan halaman kode data dalam file data.
CODEPAGE hanya relevan jika data berisi kolom karakter, varchar, atau teks dengan nilai karakter lebih besar dari 127 atau kurang dari 32. Misalnya, lihat Menentukan halaman kode.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, CODEPAGE = '65001');
CODEPAGE bukan opsi yang didukung di Linux untuk SQL Server 2017 (14.x). Untuk SQL Server 2019 (15.x), hanya opsi yang 'RAW' diizinkan untuk CODEPAGE.
Anda harus menentukan nama kolater untuk setiap kolom dalam file format.
CODEPAGE nilai |
Deskripsi |
|---|---|
ACP |
Kolom tipe data karakter, varchar, atau teks dikonversi dari halaman kode ANSI/Microsoft Windows (ISO 1252) ke halaman kode SQL Server. |
OEM (standar) |
Kolom tipe data karakter, varchar, atau teks dikonversi dari halaman kode sistem OEM ke halaman kode SQL Server. |
RAW |
Tidak ada konversi dari satu halaman kode ke halaman lain yang terjadi.
RAW adalah opsi tercepat. |
| code_page | Nomor halaman kode tertentu, misalnya, 850. Versi sebelum SQL Server 2016 (13.x) tidak mendukung halaman kode 65001 (pengodean UTF-8). |
CODEPAGE nilai |
Deskripsi |
|---|---|
ACP |
Kolom tipe data karakter, varchar, atau teks dikonversi dari halaman kode ANSI/Microsoft Windows (ISO 1252) ke halaman kode SQL Server. |
| code_page | Nomor halaman kode tertentu, misalnya, 850. Versi sebelum SQL Server 2016 (13.x) tidak mendukung halaman kode 65001 (pengodean UTF-8). |
DATAFILETYPE
Menentukan yang BULK INSERT melakukan operasi impor menggunakan nilai jenis file data yang ditentukan.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, DATAFILETYPE = 'char');
Catatan
Ganti <data-lake>.blob.core.windows.net dengan URL yang sesuai.
DATAFILETYPE nilai |
Semua data yang diwakili dalam |
|---|---|
char (standar) |
Format karakter. Untuk informasi selengkapnya, lihat Menggunakan format karakter untuk mengimpor atau mengekspor data. |
widechar |
Karakter Unicode. Untuk informasi selengkapnya, lihat Menggunakan format karakter Unicode untuk mengimpor atau mengekspor data. |
native |
Jenis data asli (database). Buat file data asli dengan mengimpor data secara massal dari SQL Server menggunakan utilitas bcp . Nilai asli menawarkan alternatif performa yang lebih tinggi untuk nilai karakter. Format asli disarankan saat Anda mentransfer data secara massal antara beberapa instans SQL Server menggunakan file data yang tidak berisi karakter extended/double-byte character set (DBCS). Untuk informasi selengkapnya, lihat Menggunakan format asli untuk mengimpor atau mengekspor data. |
widenative |
Jenis data asli (database), kecuali dalam kolom karakter, varchar, dan teks , di mana data disimpan sebagai Unicode.
widenative Buat file data dengan mengimpor data secara massal dari SQL Server menggunakan utilitas bcp.Nilai ini widenative menawarkan alternatif performa yang lebih tinggi untuk widechar. Jika file data berisi karakter yang diperluas ANSI, tentukan widenative.Untuk informasi selengkapnya, lihat Menggunakan Format Native Unicode untuk Mengimpor atau Mengekspor Data. |
DATAFILETYPE nilai |
Semua data yang diwakili dalam |
|---|---|
char (standar) |
Format karakter. Untuk informasi selengkapnya, lihat Menggunakan format karakter untuk mengimpor atau mengekspor data. |
widechar |
Karakter Unicode. Untuk informasi selengkapnya, lihat Menggunakan format karakter Unicode untuk mengimpor atau mengekspor data. |
MAXERRORS
Menentukan jumlah maksimum kesalahan sintaksis yang diizinkan dalam data sebelum operasi impor massal dibatalkan. Setiap baris yang tidak dapat diimpor oleh operasi impor massal diabaikan dan dihitung sebagai satu kesalahan. Jika max_errors tidak ditentukan, defaultnya adalah 10.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', MAXERRORS = 0);
Opsi ini MAX_ERRORS tidak berlaku untuk pemeriksaan batasan atau untuk mengonversi uang dan tipe data bigint .
FILE KESALAHAN
Menentukan file yang digunakan untuk mengumpulkan baris yang memiliki kesalahan pemformatan dan tidak dapat dikonversi ke kumpulan baris OLE DB. Baris ini disalin ke dalam file kesalahan ini dari file data "apa adanya."
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/errors');
Catatan
Ganti <data-lake>.blob.core.windows.net dengan URL yang sesuai.
File kesalahan dibuat ketika perintah dijalankan. Kesalahan terjadi jika file sudah ada. Selain itu, file kontrol dengan ekstensi .ERROR.txt dibuat, yang mereferensikan setiap baris dalam file kesalahan dan menyediakan diagnostik kesalahan. Segera setelah kesalahan dikoreksi, data dapat dimuat.
Dimulai dengan SQL Server 2017 (14.x), error_file_path dapat berada di Azure Storage.
ERRORFILE_DATA_SOURCE
Berlaku untuk: SQL Server 2017 (14.x) dan versi yang lebih baru.
Menentukan sumber data eksternal bernama yang menunjuk ke lokasi Azure Storage dari file kesalahan untuk melacak kesalahan yang ditemukan selama impor.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'curated/covid-19/bing_covid-19_data/latest/errors',
ERRORFILE_DATA_SOURCE = 'pandemicdatalake'
);
Untuk detail selengkapnya tentang membuat sumber data eksternal, lihat MEMBUAT SUMBER DATA EKSTERNAL.
BARIS PERTAMA
Menentukan jumlah baris pertama yang akan dimuat. Defaultnya adalah baris pertama dalam file data yang ditentukan.
FIRSTROW berbasis 1.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2);
Atribut FIRSTROW tidak dimaksudkan untuk melewati header kolom. Pernyataan BULK INSERT tidak mendukung melewatkan header. Jika Anda memilih untuk melewati baris, Mesin Database SQL Server hanya melihat terminator bidang, dan tidak memvalidasi data di bidang baris yang dilewati.
BARIS TERAKHIR
Menentukan jumlah baris terakhir yang akan dimuat. Defaultnya adalah 0, yang menunjukkan baris terakhir dalam file data yang ditentukan.
UKURAN BATCH
Menentukan jumlah baris dalam batch. Setiap batch disalin ke server sebagai satu transaksi. Jika ini gagal, SQL Server menerapkan atau mengembalikan transaksi untuk setiap batch. Secara default, semua data dalam file data yang ditentukan adalah satu batch. Untuk informasi tentang pertimbangan performa, lihat Pertimbangan performa nanti di artikel ini.
CEK_KONSTRAIN
Menentukan bahwa semua batasan pada tabel target atau tampilan harus diperiksa selama operasi impor massal.
CHECK_CONSTRAINTS Tanpa opsi , batasan dan CHECK apa pun FOREIGN KEY diabaikan, dan setelah operasi, batasan pada tabel ditandai sebagai tidak tepercaya.
UNIQUE dan PRIMARY KEY batasan selalu diberlakukan. Saat mengimpor ke kolom karakter yang ditentukan dengan NOT NULL batasan, BULK INSERT menyisipkan string kosong saat tidak ada nilai dalam file teks.
Pada titik tertentu, Anda harus memeriksa batasan pada seluruh tabel. Jika tabel tidak kosong sebelum operasi impor massal, biaya validasi ulang batasan mungkin melebihi biaya penerapan CHECK batasan ke data bertahap.
Situasi di mana Anda mungkin ingin batasan dinonaktifkan (perilaku default) adalah jika data input berisi baris yang melanggar batasan. Dengan CHECK batasan dinonaktifkan, Anda dapat mengimpor data lalu menggunakan pernyataan Transact-SQL untuk menghapus data yang tidak valid.
Catatan
Opsi MAXERRORS ini tidak berlaku untuk pemeriksaan batasan.
FIRE_TRIGGERS
Menentukan bahwa setiap pemicu sisipan yang ditentukan pada tabel tujuan dijalankan selama operasi impor massal. Jika pemicu didefinisikan untuk INSERT operasi pada tabel target, pemicu akan diaktifkan untuk setiap batch yang telah selesai.
Jika FIRE_TRIGGERS tidak ditentukan, tidak ada pemicu sisipan yang dijalankan.
KEEPIDENTITY
Menentukan bahwa nilai identitas atau nilai dalam file data yang diimpor akan digunakan untuk kolom identitas. Jika KEEPIDENTITY tidak ditentukan, nilai identitas untuk kolom ini diverifikasi tetapi tidak diimpor dan SQL Server secara otomatis menetapkan nilai unik berdasarkan nilai benih dan kenaikan yang ditentukan selama pembuatan tabel. Jika file data tidak berisi nilai untuk kolom identitas dalam tabel atau tampilan, gunakan file format untuk menentukan bahwa kolom identitas dalam tabel atau tampilan akan dilewati saat mengimpor data; SQL Server secara otomatis menetapkan nilai unik untuk kolom tersebut. Untuk informasi selengkapnya, lihat DBCC CHECKIDENT.
Untuk informasi selengkapnya, lihat tentang menyimpan nilai identifikasi lihat Menyimpan nilai identitas saat mengimpor data secara massal.
KEEPNULLS
Menentukan bahwa kolom kosong harus mempertahankan nilai null selama operasi impor massal, alih-alih memiliki nilai default untuk kolom yang disisipkan. Untuk informasi selengkapnya, lihat Menyimpan null atau nilai default selama impor massal.
KILOBYTES_PER_BATCH
Menentukan perkiraan jumlah kilobyte (KB) data per batch sebagai kilobytes_per_batch. Secara default, KILOBYTES_PER_BATCH tidak diketahui. Untuk informasi tentang pertimbangan performa, lihat Pertimbangan performa nanti di artikel ini.
PERINTAH
Menentukan bagaimana data dalam file data diurutkan. Performa impor massal ditingkatkan jika data yang diimpor diurutkan sesuai dengan indeks terkluster pada tabel, jika ada. Jika file data diurutkan dalam urutan selain urutan kunci indeks berkluster, atau jika tidak ada indeks berkluster pada tabel, klausa ORDER diabaikan. Nama kolom yang disediakan harus berupa nama kolom yang valid dalam tabel tujuan. Secara default, operasi sisipan massal mengasumsikan file data tidak diurutkan. Untuk impor massal yang dioptimalkan, SQL Server juga memvalidasi bahwa data yang diimpor diurutkan.
n adalah tempat penampung yang menunjukkan bahwa beberapa kolom dapat ditentukan.
ROWS_PER_BATCH
Menunjukkan perkiraan jumlah baris data dalam file data.
Secara default, semua data dalam file data dikirim ke server sebagai satu transaksi, dan jumlah baris dalam batch tidak diketahui oleh pengoptimal kueri. Jika Anda menentukan ROWS_PER_BATCH (dengan nilai > 0), server menggunakan nilai ini untuk mengoptimalkan operasi impor massal. Nilai yang ditentukan untuk ROWS_PER_BATCH harus kurang lebih sama dengan jumlah baris aktual. Untuk informasi tentang pertimbangan performa, lihat Pertimbangan performa nanti di artikel ini.
TABLOCK
Menentukan bahwa kunci tingkat tabel diperoleh selama durasi operasi impor massal. Tabel dapat dimuat secara bersamaan oleh beberapa klien jika tabel tidak memiliki indeks dan TABLOCK ditentukan. Secara default, perilaku penguncian ditentukan oleh kunci tabel opsi tabel pada beban massal. Menahan kunci selama durasi operasi impor massal mengurangi ketidakcocokan kunci pada tabel, dalam beberapa kasus dapat secara signifikan meningkatkan performa. Untuk informasi tentang pertimbangan performa, lihat Pertimbangan performa nanti di artikel ini.
Untuk indeks penyimpan kolom, perilaku penguncian berbeda karena dibagi secara internal menjadi beberapa set baris. Setiap utas memuat data secara eksklusif ke setiap set baris dengan mengambil kunci eksklusif (X) pada set baris yang memungkinkan pemuatan data paralel dengan sesi pemuatan data bersamaan. Penggunaan TABLOCK opsi menyebabkan utas mengambil kunci eksklusif pada tabel (tidak seperti kunci pembaruan massal (BU) untuk set baris tradisional) yang mencegah utas bersamaan lainnya memuat data secara bersamaan.
Opsi format file input
FORMAT
Berlaku untuk: SQL Server 2017 (14.x) dan versi yang lebih baru.
Menentukan file nilai yang dipisahkan koma yang sesuai dengan standar RFC 4180 .
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FORMAT = 'CSV');
Di Fabric Data Warehouse, pernyataan mendukung BULK INSERT format yang sama dengan pernyataan COPY INTO , sehingga FORMAT = 'PARQUET' juga didukung.
KUTIPAN LAPANGAN
Berlaku untuk: SQL Server 2017 (14.x) dan versi yang lebih baru.
Menentukan karakter yang akan digunakan sebagai karakter kutipan dalam file CSV. Jika tidak ditentukan, karakter kuotasi (") digunakan sebagai karakter kutipan, seperti yang didefinisikan dalam standar RFC 4180 .
FORMATFILE
Menentukan jalur lengkap file format. File format menjelaskan file data yang berisi respons tersimpan yang dibuat dengan menggunakan utilitas bcp pada tabel atau tampilan yang sama.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt');
Catatan
Ganti <data-lake>.blob.core.windows.net dengan URL yang sesuai.
File format harus digunakan jika:
- File data berisi kolom yang lebih besar atau lebih sedikit daripada tabel atau tampilan.
- Kolom berada dalam urutan yang berbeda.
- Pemisah kolom bervariasi.
- Ada perubahan lain dalam format data. File format biasanya dibuat dengan menggunakan utilitas bcp dan dimodifikasi dengan editor teks sesuai kebutuhan. Untuk informasi selengkapnya, lihat Utilitas bcp dan Membuat file format dengan bcp.
Dimulai dengan SQL Server 2017 (14.x), dan di Azure SQL Database, format_file_path dapat di Azure Storage.
FORMATFILE_DATA_SOURCE
Berlaku untuk: SQL Server 2017 (14.x) dan versi yang lebih baru.
Menentukan sumber data eksternal bernama yang menunjuk ke lokasi Azure Storage dari file format untuk menentukan skema data yang diimpor.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
FORMATFILE_DATA_SOURCE = 'pandemicdatalake'
);
FIELDTERMINATOR
Menentukan terminator bidang yang akan digunakan untuk char dan widechar file data. Terminator bidang default adalah \t (karakter tab). Untuk informasi selengkapnya, lihat Menentukan terminator bidang dan baris.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIELDTERMINATOR = ',', FIRSTROW = 2);
ROWTERMINATOR
Menentukan terminator baris yang akan digunakan untuk char dan widechar file data.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', ROWTERMINATOR = '\r\n', FIRSTROW = 2);
Terminator baris default adalah \r\n (carriage return dan karakter newline). Untuk informasi selengkapnya, lihat Menentukan terminator bidang dan baris.
Kompatibilitas
BULK INSERT memberlakukan validasi data yang ketat dan pemeriksaan data yang dibaca dari file yang dapat menyebabkan skrip yang ada gagal saat dijalankan pada data yang tidak valid. Misalnya, BULK INSERT memverifikasi bahwa:
- Representasi asli dari jenis data float atau real valid.
- Data Unicode memiliki panjang byte genap.
Jenis data
Konversi jenis data string-ke-desimal
Konversi jenis data string-ke-desimal yang digunakan dalam BULK INSERT mengikuti aturan yang sama dengan fungsi Transact-SQL CONVERT , yang menolak string yang mewakili nilai numerik yang menggunakan notasi ilmiah. Oleh karena itu, BULK INSERT memperlakukan string seperti nilai yang tidak valid dan melaporkan kesalahan konversi.
Untuk mengatasi perilaku ini, gunakan file format untuk mengimpor data float notasi ilmiah secara massal ke dalam kolom desimal. Dalam file format, jelaskan kolom secara eksplisit sebagai data nyata atau float . Untuk informasi selengkapnya tentang jenis data ini, lihat float dan nyata.
File format mewakili data nyata sebagai jenis data SQLFLT4 dan data float sebagai jenis data SQLFLT8 . Untuk informasi tentang file format non-XML, lihat Menentukan jenis penyimpanan file menggunakan bcp.
Contoh mengimpor nilai numerik yang menggunakan notasi ilmiah
Contoh ini menggunakan tabel berikut dalam bulktest database:
CREATE TABLE dbo.t_float
(
c1 FLOAT,
c2 DECIMAL (5, 4)
);
Pengguna ingin mengimpor data secara massal ke t_float dalam tabel. File data, C:\t_float-c.dat, berisi data float notasi ilmiah; misalnya:
8.0000000000000002E-2 8.0000000000000002E-2
Saat menyalin sampel ini, ketahui editor teks dan pengodean yang berbeda yang menyimpan karakter tab (\t) sebagai spasi. Karakter tab diharapkan nanti dalam sampel ini.
Namun, BULK INSERT tidak dapat mengimpor data ini langsung ke , t_floatkarena kolom kedua, c2, menggunakan jenis data desimal . Oleh karena itu, file format diperlukan. File format harus memetakan data float notasi
File format berikut menggunakan jenis data SQLFLT8 untuk memetakan bidang data kedua ke kolom kedua:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30" />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8" />
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8" />
</ROW>
</BCPFORMAT>
Untuk menggunakan file format ini (menggunakan nama C:\t_floatformat-c-xml.xmlfile ) untuk mengimpor data pengujian ke dalam tabel pengujian, terbitkan pernyataan Transact-SQL berikut:
BULK INSERT bulktest.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');
Penting
Azure SQL Database dan Fabric Data Warehouse hanya mendukung pembacaan dari URI (misalnya, Azure Storage).
Jenis data untuk mengekspor atau mengimpor dokumen SQLXML secara massal
Untuk mengekspor atau mengimpor data SQLXML secara massal, gunakan salah satu jenis data berikut dalam file format Anda:
| Jenis Data | Efek |
|---|---|
| SQLCHAR atau SQLVARCHAR | Data dikirim di halaman kode klien atau di halaman kode yang disiratkan oleh kolase). Efeknya sama dengan menentukan DATAFILETYPE = 'char' tanpa menentukan file format. |
| SQLNCHAR atau SQLNVARCHAR | Data dikirim sebagai Unicode. Efeknya sama dengan menentukan DATAFILETYPE = 'widechar' tanpa menentukan file format. |
| SQLBINARY atau SQLVARBIN | Data dikirim tanpa konversi apa pun. |
Keterangan
Untuk perbandingan BULK INSERT pernyataan, pernyataan INSERT ... SELECT * FROM OPENROWSET(BULK...) , dan perintah bcp , lihat Impor dan Ekspor Data Massal.
Untuk informasi tentang menyiapkan data untuk impor massal, lihat Menyiapkan data untuk ekspor atau impor massal.
Pernyataan BULK INSERT dapat dijalankan dalam transaksi yang ditentukan pengguna untuk mengimpor data ke dalam tabel atau tampilan. Secara opsional, untuk menggunakan beberapa kecocokan untuk mengimpor data secara massal, transaksi dapat menentukan BATCHSIZE klausa dalam BULK INSERT pernyataan. Jika transaksi multi-batch digulung balik, setiap batch yang dikirim transaksi ke SQL Server digulung balik.
Interoperabilitas
Mengimpor data dari file CSV
Dimulai dengan SQL Server 2017 (14.x), BULK INSERT mendukung format CSV, seperti halnya Azure SQL Database.
Sebelum SQL Server 2017 (14.x), file nilai yang dipisahkan koma (CSV) tidak didukung oleh operasi impor massal SQL Server. Namun, dalam beberapa kasus, file CSV dapat digunakan sebagai file data untuk impor data massal ke SQL Server. Untuk informasi tentang persyaratan untuk mengimpor data dari file data CSV, lihat Menyiapkan data untuk ekspor atau impor massal.
Perilaku log
Untuk informasi tentang kapan operasi penyisipan baris yang dilakukan oleh impor massal ke SQL Server dicatat dalam log transaksi, lihat Prasyarat untuk pengelogan minimal dalam impor massal. Pengelogan minimal tidak didukung di Azure SQL Database.
Keterbatasan
Saat menggunakan file format dengan BULK INSERT, Anda hanya dapat menentukan hingga 1.024 bidang. Ini sama dengan jumlah maksimum kolom yang diizinkan dalam tabel. Jika Anda menggunakan file format dengan BULK INSERT file data yang berisi lebih dari 1.024 bidang, BULK INSERT menghasilkan kesalahan 4822.
Utilitas bcp tidak memiliki batasan ini, jadi untuk file data yang berisi lebih dari 1.024 bidang, gunakan BULK INSERT tanpa file format atau gunakan perintah bcp.
Pertimbangan performa
Jika jumlah halaman yang akan disiram dalam satu batch melebihi ambang batas internal, pemindaian penuh kumpulan buffer mungkin terjadi untuk mengidentifikasi halaman mana yang akan disiram ketika batch berkomitmen. Pemindaian penuh ini dapat melukai performa impor massal. Kemungkinan kasus melebihi ambang batas internal terjadi ketika kumpulan buffer besar dikombinasikan dengan subsistem I/O yang lambat. Untuk menghindari luapan buffer pada komputer besar, jangan gunakan TABLOCK petunjuk (yang menghapus pengoptimalan massal) atau menggunakan ukuran batch yang lebih kecil (yang mempertahankan pengoptimalan massal).
Anda harus menguji berbagai ukuran batch dengan beban data Anda untuk mengetahui apa yang paling sesuai untuk Anda. Perlu diingat bahwa ukuran batch memiliki implikasi putar kembali parsial. Jika proses Anda gagal dan sebelum Anda menggunakan BULK INSERT lagi, Anda mungkin harus melakukan pekerjaan manual tambahan untuk menghapus bagian dari baris yang berhasil disisipkan, sebelum kegagalan terjadi.
Dengan Azure SQL Database, pertimbangkan untuk sementara meningkatkan tingkat performa database atau instans sebelum impor jika Anda mengimpor data dalam volume besar.
Keamanan
Delegasi akun keamanan (peniruan identitas)
Jika pengguna menggunakan login SQL Server, profil keamanan akun proses SQL Server digunakan. Login menggunakan autentikasi SQL Server tidak dapat diautentikasi di luar Mesin Database. Oleh karena itu, ketika BULK INSERT perintah dimulai oleh login menggunakan autentikasi SQL Server, koneksi ke data dibuat menggunakan konteks keamanan akun proses SQL Server (akun yang digunakan oleh layanan Mesin Database SQL Server).
Agar berhasil membaca data sumber, Anda harus memberikan akun yang digunakan oleh Mesin Database SQL Server, akses ke data sumber. Sebaliknya, jika pengguna SQL Server masuk dengan menggunakan Autentikasi Windows, pengguna hanya dapat membaca file-file yang dapat diakses oleh akun pengguna, terlepas dari profil keamanan proses SQL Server.
Saat menjalankan BULK INSERT pernyataan dengan menggunakan sqlcmd atau osql, dari satu komputer, menyisipkan data ke SQL Server di komputer kedua, dan menentukan data_file di komputer ketiga dengan menggunakan jalur UNC, Anda mungkin menerima kesalahan 4861.
Untuk mengatasi kesalahan ini, gunakan Autentikasi SQL Server dan tentukan login SQL Server yang menggunakan profil keamanan akun proses SQL Server, atau konfigurasikan Windows untuk mengaktifkan delegasi akun keamanan. Untuk informasi tentang cara mengaktifkan akun pengguna agar tepercaya untuk delegasi, lihat Bantuan Windows.
Untuk informasi selengkapnya tentang ini dan pertimbangan keamanan lainnya untuk menggunakan BULK INSERT, lihat Menggunakan BULK INSERT atau OPENROWSET(BULK...) untuk mengimpor data ke SQL Server.
Saat mengimpor dari Azure Storage dan data tidak bersifat publik (akses anonim), buat KREDENSIAL CAKUPAN DATABASE berdasarkan kunci SAS yang dienkripsi dengan kunci master database (DMK), lalu buat sumber database eksternal untuk digunakan dalam perintah Anda BULK INSERT .
Atau, buat KREDENSIAL CAKUPAN DATABASE berdasarkan MANAGED IDENTITY untuk mengotorisasi permintaan akses data di akun penyimpanan non-publik. Saat menggunakan MANAGED IDENTITY, Azure Storage harus memberikan izin ke identitas terkelola instans dengan menambahkan peran kontrol akses berbasis peran (RBAC) Azure bawaan Kontributor Data Blob Penyimpanan yang menyediakan akses baca/tulis ke identitas terkelola untuk kontainer Azure Storage yang diperlukan. Azure SQL Managed Instance memiliki identitas terkelola yang ditetapkan sistem, dan juga dapat memiliki satu atau beberapa identitas terkelola yang ditetapkan pengguna. Anda dapat menggunakan identitas terkelola yang ditetapkan sistem atau identitas terkelola yang ditetapkan pengguna untuk mengotorisasi permintaan. Untuk otorisasi, default identitas instans terkelola akan digunakan (yaitu, identitas terkelola utama yang ditetapkan pengguna, atau identitas terkelola yang ditetapkan sistem jika identitas terkelola yang ditetapkan pengguna tidak ditentukan). Sebagai contoh, lihat Mengimpor data dari file di Azure Storage.
Penting
Identitas Terkelola berlaku untuk Azure SQL, dan SQL Server 2025 (17.x) dan versi yang lebih baru.
Izin
Izin berikut berlaku untuk lokasi tempat data diimpor secara massal (target).
INSERT Memerlukan izin dan ADMINISTER BULK OPERATIONS . Di Azure SQL Database, INSERT dan ADMINISTER DATABASE BULK OPERATIONS izin diperlukan.
ADMINISTER BULK OPERATIONS izin atau peran bulkadmin tidak didukung untuk SQL Server di Linux.
Hanya sysadmin yang dapat melakukan sisipan massal untuk SQL Server di Linux.
Selain itu, ALTER TABLE izin diperlukan jika satu atau beberapa kondisi berikut ini benar:
Batasan ada dan
CHECK_CONSTRAINTSopsi tidak ditentukan.Menonaktifkan batasan adalah perilaku default. Untuk memeriksa batasan secara eksplisit, gunakan
CHECK_CONSTRAINTSopsi .Pemicu ada dan
FIRE_TRIGGERopsi tidak ditentukan.Secara default, pemicu tidak diaktifkan. Untuk mengaktifkan pemicu secara eksplisit, gunakan
FIRE_TRIGGERopsi .Anda menggunakan
KEEPIDENTITYopsi untuk mengimpor nilai identitas dari file data.
Contoh
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
Penting
Azure SQL Database dan Fabric Warehouse hanya mendukung pembacaan dari Azure Storage.
J. Menggunakan pipa untuk mengimpor data dari file
Contoh berikut mengimpor informasi detail pesanan ke dalam AdventureWorks2022.Sales.SalesOrderDetail tabel dari file data yang ditentukan dengan menggunakan pipa (|) sebagai terminator bidang dan |\n sebagai terminator baris.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');
B. Menggunakan argumen FIRE_TRIGGERS
Contoh berikut menentukan FIRE_TRIGGERS argumen .
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);
C. Menggunakan umpan baris sebagai terminator baris
Contoh berikut mengimpor file yang menggunakan umpan baris sebagai terminator baris seperti output UNIX:
DECLARE @bulk_cmd AS VARCHAR (1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';
EXECUTE (@bulk_cmd);
Catatan
Pada Windows, \n secara otomatis diganti dengan \r\n.
D. Tentukan halaman kode
Contoh berikut menunjukkan cara menentukan halaman kode.
BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');
E. Mengimpor data dari file CSV
Contoh berikut menunjukkan cara menentukan file CSV, melewati header (baris pertama), menggunakan ; sebagai terminator bidang dan 0x0a sebagai terminator baris:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
Contoh berikut menunjukkan cara menentukan file CSV dalam format UTF-8 (menggunakan CODEPAGE ), 65001melewati header (baris pertama), menggunakan ; sebagai terminator bidang dan 0x0a sebagai terminator baris:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
CODEPAGE = '65001',
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
F. Mengimpor data dari file di Azure Storage
Memuat data dari CSV di Azure Storage dengan token SAS
Contoh berikut menunjukkan cara memuat data dari file CSV di lokasi Azure Storage tempat Anda membuat Tanda Tangan Akses Bersama (SAS). Lokasi Azure Storage dikonfigurasi sebagai sumber data eksternal, yang memerlukan kredensial cakupan database menggunakan kunci SAS yang dienkripsi menggunakan DMK dalam database pengguna.
Catatan
Pastikan bahwa Anda tidak memiliki lead ? dalam token SAS, dan bahwa Anda setidaknya memiliki izin baca pada objek yang harus dimuat srt=o&sp=r, dan periode kedaluwarsa tersebut valid (semua tanggal dalam waktu UTC).
(Opsional) DMK tidak diperlukan jika a DATABASE SCOPED CREDENTIAL tidak diperlukan, karena blob dikonfigurasi untuk akses publik (anonim).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(Opsional) A DATABASE SCOPED CREDENTIAL tidak diperlukan karena blob dikonfigurasi untuk akses publik (anonim).
Jangan sertakan leading ? dalam token SAS. Pastikan Anda setidaknya memiliki izin baca pada objek yang harus dimuat (srt=o&sp=r), dan bahwa periode kedaluwarsa valid (semua tanggal dalam waktu UTC).
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '******srt = sco&sp = rwac&se = 2017-02-01T00:55:34Z&st = 2016-12-29T16:55:34Z***************';
Catatan
CREDENTIAL tidak diperlukan jika blob dikonfigurasi untuk akses publik (anonim).
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Muat data dari CSV di Azure Storage dengan identitas terkelola
Contoh berikut menunjukkan cara menggunakan BULK INSERT perintah untuk memuat data dari file CSV di lokasi Azure Storage menggunakan Identitas Terkelola. Lokasi Azure Storage dikonfigurasi sebagai sumber data eksternal.
(Opsional) DMK tidak diperlukan jika a DATABASE SCOPED CREDENTIAL tidak diperlukan, karena blob dikonfigurasi untuk akses publik (anonim).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(Opsional) A DATABASE SCOPED CREDENTIAL tidak diperlukan, karena blob dikonfigurasi untuk akses publik (anonim):
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
Berikan peran Kontributor Data Blob Penyimpanan, untuk menyediakan akses baca/tulis ke identitas terkelola untuk kontainer Azure Storage yang diperlukan.
Catatan
CREDENTIAL tidak diperlukan jika blob dikonfigurasi untuk akses publik (anonim).
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Penting
Identitas terkelola berlaku untuk SQL Server 2025 (17.x) dan versi yang lebih baru, dan Azure SQL.
G. Mengimpor data dari file di Azure Storage dan menentukan file kesalahan
Contoh berikut menunjukkan cara memuat data dari file CSV di lokasi Azure Storage, yang dikonfigurasi sebagai sumber data eksternal, dan juga menentukan file kesalahan. Anda memerlukan kredensial lingkup database menggunakan tanda tangan akses bersama. Jika berjalan di Azure SQL Database, opsi harus disertai dengan ERRORFILE, jika tidak, ERRORFILE_DATA_SOURCE impor mungkin gagal dengan kesalahan izin. File yang ditentukan di ERRORFILE seharusnya tidak ada dalam kontainer.
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices',
FORMAT = 'CSV',
ERRORFILE = 'MyErrorFile',
ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);
Untuk contoh lengkap BULK INSERT termasuk mengonfigurasi kredensial dan sumber data eksternal, lihat Contoh akses massal ke data di Azure Storage.
Contoh lainnya
Contoh lain BULK INSERT disediakan dalam artikel berikut:
- Contoh impor dan ekspor dokumen XML secara massal
- Simpan nilai identitas saat mengimpor data secara massal
- Simpan nilai null atau default selama impor massal
- Menentukan terminator bidang dan baris
- Menggunakan file format untuk mengimpor data secara massal
- Menggunakan format karakter untuk mengimpor atau mengekspor data
- Menggunakan format asli untuk mengimpor atau mengekspor data
- Menggunakan format karakter Unicode untuk mengimpor atau mengekspor data
- Menggunakan format asli Unicode untuk mengimpor atau mengekspor data
- Menggunakan file format untuk melewati kolom tabel
- Menggunakan file format untuk memetakan kolom tabel ke bidang file data