Bagikan melalui


SALIN KE (Transact-SQL)

Berlaku untuk:Azure Synapse Analytics

Artikel ini menjelaskan cara menggunakan COPY pernyataan di Azure Synapse Analytics untuk memuat dari akun penyimpanan eksternal. Pernyataan ini COPY memberikan fleksibilitas paling besar untuk penyerapan data throughput tinggi ke Azure Synapse Analytics.

Note

Untuk Gudang di Microsoft Fabric, kunjungi COPY INTO.

Gunakan COPY untuk kemampuan berikut:

  • Gunakan pengguna dengan hak istimewa yang lebih rendah untuk memuat tanpa memerlukan izin CONTROL yang ketat pada gudang data
  • Jalankan satu pernyataan T-SQL tanpa harus membuat objek database lainnya
  • Mengurai dan memuat file CSV dengan benar di mana pemisah (string, bidang, baris) diloloskan dalam kolom yang dibatasi string
  • Tentukan model izin yang lebih halus tanpa mengekspos kunci akun penyimpanan menggunakan Share Access Signatures (SAS)
  • Menggunakan akun penyimpanan yang berbeda untuk lokasi (ERRORFILEREJECTED_ROW_LOCATION)
  • Menyesuaikan nilai default untuk setiap kolom target dan menentukan bidang data sumber untuk dimuat ke kolom target tertentu
  • Tentukan terminator baris kustom, terminator bidang, dan kutipan bidang untuk file CSV
  • Menggunakan format Tanggal SQL Server untuk file CSV
  • Menentukan kartubebas dan beberapa file di jalur lokasi penyimpanan
  • Penemuan skema otomatis menyederhanakan proses penentuan dan pemetaan data sumber ke dalam tabel target
  • Proses pembuatan tabel otomatis secara otomatis membuat tabel dan bekerja bersama dengan penemuan skema otomatis
  • Secara langsung memuat jenis data kompleks dari file Parquet seperti Peta dan Daftar ke dalam kolom string, tanpa menggunakan alat lain untuk memproses data sebelumnya

Note

Untuk memuat jenis data kompleks dari file Parquet, pembuatan tabel otomatis harus diaktifkan dengan menggunakan AUTO_CREATE_TABLE.

Kunjungi dokumentasi berikut untuk contoh komprehensif dan mulai cepat menggunakan pernyataan COPY:

Note

ID Microsoft Entra sebelumnya dikenal sebagai Azure Active Directory (Azure AD).

Syntax

COPY INTO [ schema. ] table_name
[ (Column_list) ]
FROM '<external_location>' [ , ...n ]
WITH
 (
 [ FILE_TYPE = { 'CSV' | 'PARQUET' | 'ORC' } ]
 [ , FILE_FORMAT = EXTERNAL FILE FORMAT OBJECT ]
 [ , CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , ERRORFILE = ' [ http(s)://storageaccount/container ] /errorfile_directory [ / ] ] '
 [ , ERRORFILE_CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , MAXERRORS = max_errors ]
 [ , COMPRESSION = { 'Gzip' | 'DefaultCodec' | 'Snappy' } ]
 [ , FIELDQUOTE = 'string_delimiter' ]
 [ , FIELDTERMINATOR =  'field_terminator' ]
 [ , ROWTERMINATOR = 'row_terminator' ]
 [ , FIRSTROW = first_row ]
 [ , DATEFORMAT = 'date_format' ]
 [ , ENCODING = { 'UTF8' | 'UTF16' } ]
 [ , IDENTITY_INSERT = { 'ON' | 'OFF' } ]
 [ , AUTO_CREATE_TABLE = { 'ON' | 'OFF' } ]
)

Arguments

schema_name

Opsional jika skema default untuk pengguna yang melakukan operasi adalah skema tabel yang ditentukan. Jika skema tidak ditentukan, dan skema default pengguna yang melakukan operasi COPY berbeda dari skema tabel yang ditentukan, maka operasi COPY dibatalkan dan pesan kesalahan dikembalikan.

table_name

Nama tabel yang akan diSALIN datanya. Tabel target bisa berupa tabel sementara atau permanen dan harus sudah ada dalam database. Untuk mode deteksi skema otomatis, jangan berikan daftar kolom.

(column_list)

Daftar opsional dari satu atau beberapa kolom yang digunakan untuk memetakan bidang data sumber ke kolom tabel target untuk memuat data.

Jangan tentukan column_list saat AUTO_CREATE_TABLE = 'ON'.

column_list harus diapit tanda kurung dan dibatasi oleh koma. Daftar kolom adalah format berikut:

[(Column_name [Default_value default] [Field_number] [,... n])]

  • Column_name - nama kolom dalam tabel target.
  • Default_value - nilai default yang menggantikan nilai NULL apa pun dalam file input. Nilai default berlaku untuk semua format file. COPY mencoba memuat NULL dari file input saat kolom dihilangkan dari daftar kolom atau ketika ada bidang file input kosong. Nilai default mendahului kata kunci 'default'
  • Field_number - nomor bidang file input yang dipetakan ke kolom target.
  • Pengindeksan bidang dimulai pada 1.

Saat daftar kolom tidak ditentukan, COPY memetakan kolom berdasarkan urutan sumber dan target: Bidang input 1 masuk ke kolom target 1, bidang 2 masuk ke kolom 2, dll.

Lokasi eksternal

Adalah tempat file yang berisi data ditahapkan. Saat ini Azure Data Lake Storage (ADLS) Gen2 dan Azure Blob Storage didukung:

  • Lokasi eksternal untuk Blob Storage: https://<account\>.blob.core.windows.net/<container\>/<path\>
  • Lokasi eksternal untuk ADLS Gen2: https://<account\>.dfs.core.windows.net/<container\>/<path\>

Note

Titik .blob akhir juga tersedia untuk ADLS Gen2 dan saat ini menghasilkan performa terbaik. Gunakan titik akhir .blob saat .dfs tidak diperlukan untuk metode autentikasi Anda.

  • Akun - Nama akun penyimpanan

  • Kontainer - Nama kontainer blob

  • Jalur - folder atau jalur file untuk data. Lokasi dimulai dari kontainer. Jika folder ditentukan, COPY mengambil semua file dari folder dan semua subfoldernya. COPY mengabaikan folder tersembunyi dan tidak mengembalikan file yang dimulai dengan garis bawah (_) atau titik (.) kecuali ditentukan secara eksplisit di jalur. Perilaku ini sama bahkan ketika menentukan jalur dengan kartubebas.

Kartubebas dapat disertakan dalam jalur di mana

  • Pencocokan nama jalur kartubebas peka huruf besar/kecil
  • Kartubebas dapat diloloskan menggunakan karakter garis miring terbalik (\)
  • Ekspansi wildcard diterapkan secara rekursif. Misalnya, semua file CSV di bawah Customer1 (termasuk subdirektori Customer1) dimuat dalam contoh berikut: Account/Container/Customer1/*.csv

Note

Untuk performa terbaik, hindari menentukan kartubebas yang akan meluas melalui sejumlah besar file. Jika memungkinkan, cantumkan beberapa lokasi file alih-alih menentukan kartubebas.

Beberapa lokasi file hanya dapat ditentukan dari akun penyimpanan dan kontainer yang sama melalui daftar yang dipisahkan koma seperti:

  • https://<account>.blob.core.windows.net/<container\>/<path\>, https://<account\>.blob.core.windows.net/<container\>/<path\>

FILE_TYPE = { 'CSV' | 'PARKET' | 'ORC' }

FILE_TYPE menentukan format data eksternal.

  • CSV: Menentukan file nilai yang dipisahkan koma yang sesuai dengan standar RFC 4180 .
  • PARQUET: Menentukan format Parquet.
  • ORC: Menentukan format Optimized Row Columnar (ORC).

Note

Jenis file 'Teks Yang Dibatasi' di PolyBase digantikan oleh format file 'CSV' di mana pemisah koma default dapat dikonfigurasi melalui parameter FIELDTERMINATOR.

FILE_FORMAT = external_file_format_name

FILE_FORMAT hanya berlaku untuk file Parquet dan ORC dan menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

KREDENSIAL (IDENTITAS = '', RAHASIA = '')

INFO MASUK menentukan mekanisme autentikasi untuk mengakses akun penyimpanan eksternal. Metode autentikasi adalah:

CSV Parquet ORC
Penyimpanan Blob Azure SAS/MSI/SERVICE PRINCIPAL/KEY/Entra SAS/KEY SAS/KEY
Azure Data Lake Gen2 SAS/MSI/SERVICE PRINCIPAL/KEY/Entra SAS (blob 1 )/MSI (dfs 2 )/SERVICE PRINCIPAL/KEY/Entra SAS (blob 1 )/MSI (dfs 2 )/SERVICE PRINCIPAL/KEY/Entra

1 Titik akhir blob (.blob.core.windows.net) di jalur lokasi eksternal Anda diperlukan untuk metode autentikasi ini.

2 Titik akhir dfs (.dfs.core.windows.net) di jalur lokasi eksternal Anda diperlukan untuk metode autentikasi ini.

Note

  • Saat mengautentikasi menggunakan ID Microsoft Entra atau ke akun penyimpanan publik, KREDENSIAL tidak perlu ditentukan.
  • Jika akun penyimpanan Anda dikaitkan dengan VNet, Anda harus mengautentikasi menggunakan identitas terkelola.
  • Mengautentikasi dengan Tanda Tangan Akses Bersama (SAS)

    • IDENTITY: Konstanta dengan nilai 'Tanda Tangan Akses Bersama'
    • RAHASIA: Tandatanganakses bersama menyediakan akses yang didelegasikan ke sumber daya di akun penyimpanan Anda.
  • Izin minimum yang diperlukan: READ dan LIST

  • Mengautentikasi dengan Perwakilan Layanan

    • IDENTITAS: <ClientID>@<OAuth_2.0_Token_EndPoint>
    • RAHASIA: Kunci perwakilan layanan aplikasi Microsoft Entra
  • Peran RBAC minimum yang diperlukan: Kontributor data blob penyimpanan, kontributor data blob Penyimpanan, pemilik data blob Penyimpanan, atau pembaca data blob Penyimpanan

  • Mengautentikasi dengan kunci akun Penyimpanan

    • IDENTITY: Konstanta dengan nilai 'Kunci Akun Penyimpanan'
  • RAHASIA: Kunci akun penyimpanan

  • Mengautentikasi dengan Identitas Terkelola (Titik Akhir Layanan VNet)

    • IDENTITY: Konstanta dengan nilai 'Identitas Terkelola'
  • Peran RBAC minimum diperlukan: Kontributor data blob penyimpanan atau Pemilik data blob Penyimpanan untuk server logis terdaftar Microsoft Entra di Azure. Saat menggunakan kumpulan SQL khusus (sebelumnya SQL DW) yang tidak terkait dengan Ruang Kerja Synapse, peran RBAC ini tidak diperlukan, tetapi identitas terkelola memerlukan izin Daftar Kontrol Akses (ACL) pada objek target untuk mengaktifkan akses baca ke file sumber

  • Mengautentikasi dengan pengguna Microsoft Entra

    • KREDENSIAL tidak diperlukan
  • Peran RBAC minimum diperlukan: Kontributor data blob penyimpanan atau Pemilik data blob Penyimpanan untuk pengguna Microsoft Entra

ERRORFILE = Lokasi Direktori

ERRORFILE hanya berlaku untuk CSV. Menentukan direktori dalam pernyataan COPY tempat baris yang ditolak dan file kesalahan yang sesuai harus ditulis. Jalur lengkap dari akun penyimpanan dapat ditentukan atau jalur relatif terhadap kontainer dapat ditentukan. Jika jalur yang ditentukan tidak ada, jalur dibuat atas nama Anda. Direktori anak dibuat dengan nama _rejectedrows. Karakter _ memastikan bahwa direktori lolos untuk pemrosesan data lain kecuali dinamai secara eksplisit dalam parameter lokasi.

Note

Ketika jalur relatif diteruskan ke ERRORFILE, jalur relatif terhadap jalur kontainer yang ditentukan dalam external_location.

Dalam direktori ini, ada folder yang dibuat berdasarkan waktu pengiriman beban dalam format YearMonthDay -HourMinuteSecond (Misalnya 20180330-173205). Dalam folder ini, dua jenis file ditulis, file alasan (Kesalahan) dan file data (Baris) masing-masing preappending dengan queryID, distributionID, dan guid file. Karena data dan alasannya ada dalam file terpisah, file yang sesuai memiliki awalan yang cocok.

Jika ERRORFILE memiliki jalur lengkap akun penyimpanan yang ditentukan, maka ERRORFILE_CREDENTIAL digunakan untuk menyambungkan ke penyimpanan tersebut. Jika tidak, nilai yang disebutkan untuk INFO MASUK digunakan. Ketika kredensial yang sama yang digunakan untuk data sumber digunakan untuk ERRORFILE, pembatasan yang berlaku untuk ERRORFILE_CREDENTIAL juga berlaku

ERRORFILE_CREDENTIAL = (IDENTITAS = '', RAHASIA = '')

ERRORFILE_CREDENTIAL hanya berlaku untuk file CSV. Sumber data dan metode autentikasi yang didukung adalah:

  • Azure Blob Storage - SAS/SERVICE PRINCIPAL/Entra

  • Azure Data Lake Gen2 - SAS/MSI/SERVICE PRINCIPAL/Entra

  • Mengautentikasi dengan Tanda Tangan Akses Bersama (SAS)

    • IDENTITY: Konstanta dengan nilai 'Tanda Tangan Akses Bersama'
    • RAHASIA: Tandatanganakses bersama menyediakan akses yang didelegasikan ke sumber daya di akun penyimpanan Anda.
  • Izin minimum yang diperlukan: BACA, DAFTAR, TULIS, BUAT, HAPUS

  • Mengautentikasi dengan Perwakilan Layanan

    • IDENTITAS: <ClientID>@<OAuth_2.0_Token_EndPoint>
    • RAHASIA: Kunci perwakilan layanan aplikasi Microsoft Entra
  • Peran RBAC minimum yang diperlukan: Kontributor data blob penyimpanan atau pemilik data blob Penyimpanan

Note

Menggunakan titik akhir token OAuth 2.0 V1

  • Mengautentikasi dengan Identitas Terkelola (Titik Akhir Layanan VNet)

    • IDENTITY: Konstanta dengan nilai 'Identitas Terkelola'
  • Peran RBAC minimum yang diperlukan: Kontributor data blob penyimpanan atau Pemilik data blob Penyimpanan untuk server SQL Database terdaftar Microsoft Entra

  • Mengautentikasi dengan pengguna Microsoft Entra

    • KREDENSIAL tidak diperlukan
  • Peran RBAC minimum diperlukan: Kontributor data blob penyimpanan atau Pemilik data blob Penyimpanan untuk pengguna Microsoft Entra

Menggunakan kunci akun penyimpanan dengan ERRORFILE_CREDENTIAL tidak didukung.

Note

Jika Anda menggunakan akun penyimpanan yang sama untuk ERRORFILE Anda dan menentukan jalur ERRORFILE relatif terhadap akar kontainer, Anda tidak perlu menentukan ERROR_CREDENTIAL.

MAXERRORS = max_errors

MAXERRORS menentukan jumlah maksimum baris penolakan yang diizinkan dalam beban sebelum operasi COPY gagal. Setiap baris yang tidak dapat diimpor oleh operasi COPY diabaikan dan dihitung sebagai satu kesalahan. Jika max_errors tidak ditentukan, defaultnya adalah 0.

MAXERRORS tidak dapat digunakan dengan AUTO_CREATE_TABLE.

Ketika FILE_TYPE adalah PARQUET, pengecualian yang disebabkan oleh kesalahan konversi jenis data (misalnya, biner Parquet ke bilangan bulat SQL) masih menyebabkan COPY INTO kegagalan, mengabaikan MAXERRORS.

KOMPRESI = { 'DefaultCodec ' | 'Snappy' | 'GZIP' | 'NONE'}

KOMPRESI bersifat opsional dan menentukan metode kompresi data untuk data eksternal.

  • CSV mendukung GZIP
  • Parquet mendukung GZIP dan Snappy
  • ORC mendukung DefaultCodec dan Snappy.
  • Zlib adalah kompresi default untuk ORC

Perintah COPY otomatis memetakan jenis kompresi berdasarkan ekstensi file saat parameter ini tidak ditentukan:

  • .gz - GZIP
  • .snappy - Tajam
  • .deflate - DefaultCodec (hanya Parquet dan ORC)

Perintah COPY mengharuskan file gzip tidak berisi sampah berikutnya untuk beroperasi secara normal. Format gzip secara ketat mengharuskan file terdiri dari anggota yang valid tanpa informasi tambahan sebelum, antara, atau sesudahnya. Setiap penyimpangan dari format ini, seperti adanya data non-gzip berikutnya, akan mengakibatkan kegagalan perintah COPY. Pastikan untuk memverifikasi bahwa tidak ada sampah di akhir file gzip untuk memastikan COPY dapat berhasil memproses file-file ini.

FIELDQUOTE = 'field_quote'

FIELDQUOTE berlaku untuk CSV dan menentukan satu karakter yang digunakan sebagai karakter kutipan (pembatas string) dalam file CSV. Jika tidak ditentukan, karakter kuotasi (") digunakan sebagai karakter kutipan seperti yang didefinisikan dalam standar RFC 4180. Notasi heksadesimal juga didukung untuk FIELDQUOTE. Karakter ASCII dan multi-byte yang diperluas tidak didukung dengan UTF-8 untuk FIELDQUOTE.

Note

Karakter FIELDQUOTE diloloskan dalam kolom string di mana ada kehadiran FIELDQUOTE ganda (pemisah).

FIELDTERMINATOR = 'field_terminator'

FIELDTERMINATOR Only berlaku untuk CSV. Menentukan terminator bidang yang digunakan dalam file CSV. Terminator bidang dapat ditentukan menggunakan notasi heksadesimal. Terminator bidang dapat berupa multi-karakter. Terminator bidang default adalah (,). Karakter ASCII dan multi-byte yang diperluas tidak didukung dengan UTF-8 untuk FIELDTERMINATOR.

TERMINATOR BARIS = 'row_terminator'

TERMINATOR BARIS Hanya berlaku untuk CSV. Menentukan terminator baris yang digunakan dalam file CSV. Terminator baris dapat ditentukan menggunakan notasi heksadesimal. Terminator baris dapat berupa multi-karakter. Secara default, terminator baris adalah \r\n.

Perintah COPY mengawali \r karakter saat menentukan \n (baris baru) menghasilkan \r\n. Untuk menentukan hanya \n karakter, gunakan notasi heksadesimal (0x0A). Saat menentukan terminator baris multi-karakter dalam heksadesimal, jangan tentukan 0x di antara setiap karakter.

Karakter ASCII dan multi-byte yang diperluas tidak didukung dengan UTF-8 untuk TERMINATOR BARIS.

BARIS PERTAMA = First_row_int

FIRSTROW berlaku untuk CSV dan menentukan nomor baris yang dibaca terlebih dahulu di semua file untuk perintah COPY. Nilai mulai dari 1, yang merupakan nilai default. Jika nilai diatur ke dua, baris pertama di setiap file (baris header) dilewati saat data dimuat. Baris dilewati berdasarkan keberadaan terminator baris.

DATEFORMAT = { 'mdy' | 'Dmy' | 'YMD' | 'YDM' | 'MYD' | 'dym' }

DATEFORMAT hanya berlaku untuk CSV dan menentukan format tanggal pemetaan tanggal ke format tanggal SQL Server. Untuk gambaran umum semua jenis dan fungsi data tanggal dan waktu Transact-SQL, lihat Jenis dan Fungsi Data Tanggal dan Waktu (Transact-SQL). DATEFORMAT dalam perintah COPY lebih diutamakan daripada DATEFORMAT yang dikonfigurasi pada tingkat sesi.

PENGODEAN = 'UTF8' | 'UTF16'

ENCODING hanya berlaku untuk CSV. Defaultnya adalah UTF8. Menentukan standar pengodean data untuk file yang dimuat oleh perintah COPY.

IDENTITY_INSERT = 'ON' | 'NONAKTIF'

IDENTITY_INSERT menentukan apakah nilai identitas atau nilai dalam file data yang diimpor akan digunakan untuk kolom identitas. Jika IDENTITY_INSERT NONAKTIF (default), nilai identitas untuk kolom ini diverifikasi, tetapi tidak diimpor. Perhatikan perilaku berikut dengan perintah COPY:

  • Jika IDENTITY_INSERT NONAKTIF, dan tabel memiliki kolom identitas
    • Daftar kolom harus ditentukan yang tidak memetakan bidang input ke kolom identitas.
  • Jika IDENTITY_INSERT AKTIF, dan tabel memiliki kolom identitas
    • Jika daftar kolom diteruskan, daftar tersebut harus memetakan bidang input ke kolom identitas.
  • Nilai default tidak didukung untuk KOLOM IDENTITAS di daftar kolom.
  • IDENTITY_INSERT hanya dapat diatur untuk satu tabel pada satu waktu.

Azure Synapse Analytics secara otomatis menetapkan nilai unik berdasarkan nilai benih dan kenaikan yang ditentukan selama pembuatan tabel.

AUTO_CREATE_TABLE = { 'ON' | 'MATI' }

AUTO_CREATE_TABLE menentukan apakah tabel dapat dibuat secara otomatis dengan bekerja bersama dengan penemuan skema otomatis. Ini hanya tersedia untuk file Parquet.

  • AKTIF: Mengaktifkan pembuatan tabel otomatis. Proses ini COPY INTO membuat tabel baru secara otomatis dengan menemukan struktur file yang akan dimuat. Juga dapat digunakan dengan tabel yang sudah ada sebelumnya untuk memanfaatkan penemuan skema otomatis file Parquet.
  • NONAKTIF: Pembuatan tabel otomatis tidak diaktifkan. Default.

Note

Pembuatan tabel otomatis bekerja bersama dengan penemuan skema otomatis. Pembuatan tabel otomatis TIDAK diaktifkan secara default.

Permissions

Pengguna yang menjalankan perintah COPY harus memiliki izin berikut:

Memerlukan izin INSERT dan ADMINISTER BULK OPERATIONS. Di Izin Azure Synapse Analytics, INSERT, dan ADMINISTER DATABASE BULK OPERATIONS diperlukan.

Selain itu, jika pengguna yang menjalankan perintah COPY juga berniat untuk menghasilkan tabel baru dan memuat data ke dalamnya, mereka memerlukan izin CREATE TABLE dan ALTER ON SCHEMA.

Misalnya, untuk mengizinkan mike@contoso.com penggunaan COPY untuk membuat tabel baru dalam HR skema, dan menyisipkan data dari file Parquet, gunakan sampel Transact-SQL berikut:

GRANT ADMINISTER DATABASE BULK OPERATIONS to [mike@contoso.com];
GRANT INSERT to [mike@contoso.com];

GRANT CREATE TABLE to [mike@contoso.com];
GRANT ALTER on SCHEMA::HR to [mike@contoso.com];

Remarks

Pernyataan COPY hanya menerima karakter valid UTF-8 dan UTF-16 untuk data baris dan parameter perintah. File atau parameter sumber (seperti TERMINATOR BARIS atau TERMINATOR BIDANG) yang menggunakan karakter yang tidak valid mungkin salah ditafsirkan oleh pernyataan COPY dan menyebabkan hasil yang tidak terduga seperti kerusakan data, atau kegagalan lainnya. Pastikan file dan parameter sumber Anda sesuai dengan UTF-8 atau UTF-16 sebelum Anda memanggil pernyataan COPY.

MAXDOP Petunjuk kueri tidak didukung dengan COPY INTO.

Untuk memastikan eksekusi yang andal, file dan folder sumber harus tetap tidak berubah selama durasi COPY INTO operasi.

  • Memodifikasi, menghapus, atau mengganti file atau folder yang direferensikan saat perintah berjalan dapat menyebabkan operasi gagal atau mengakibatkan penyerapan data yang tidak konsisten.
  • Sebelum menjalankan COPY INTO, verifikasi bahwa semua data sumber stabil dan tidak akan diubah selama proses.

Examples

A. Memuat dari akun penyimpanan publik

Contoh berikut adalah bentuk COPY perintah yang paling sederhana, yang memuat data dari akun penyimpanan publik. Untuk contoh ini, default pernyataan COPY cocok dengan format file csv item baris.

COPY INTO dbo.[lineitem]
FROM 'https://unsecureaccount.blob.core.windows.net/customerdatasets/folder1/lineitem.csv'
WITH (FIELDTERMINATOR = '|')

Nilai default perintah COPY adalah:

  • DATEFORMAT = DATEFORMAT Sesi

  • MAXERROR = 0

  • Kompresi default tidak dikompresi

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Important

COPY memperlakukan \n sebagai \r\n internal. Untuk informasi selengkapnya, lihat bagian ROWTERMINATOR.

  • BARIS PERTAMA = 1

  • PENGODEAN = 'UTF8'

  • FILE_TYPE = 'CSV'

  • IDENTITY_INSERT = 'NONAKTIF'

B. Memuat autentikasi melalui Share Access Signature (SAS)

Contoh berikut memuat file yang menggunakan umpan baris sebagai terminator baris seperti output UNIX. Contoh ini juga menggunakan kunci SAS untuk mengautentikasi ke Azure Blob Storage.

COPY INTO test_1
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='?sv=2018-03-28&ss=bfqt&srt=sco&sp=rl&st=2016-10-17T20%3A14%3A55Z&se=2021-10-18T20%3A19%3A00Z&sig=IEoOdmeYnE9%2FKiJDSHFSYsz4AkNa%2F%2BTx61FuQ%2FfKHefqoBE%3D'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=';',
    ROWTERMINATOR='0X0A',
    ENCODING = 'UTF8',
    DATEFORMAT = 'ymd',
    MAXERRORS = 10,
    ERRORFILE = '/errorsfolder',--path starting from the storage container
    IDENTITY_INSERT = 'ON'
)

C. Muat dengan daftar kolom dengan nilai default yang mengautentikasi melalui Kunci Akun Penyimpanan

Contoh ini memuat file yang menentukan daftar kolom dengan nilai default.

--Note when specifying the column list, input field numbers start from 1
COPY INTO test_1 (Col_one default 'myStringDefault' 1, Col_two default 1 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='<Your_Account_Key>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='x6RWv4It5F2msnjelv3H4DA80n0PQW0daPdw43jM0nyetx4c6CpDkdj3986DX5AHFMIf/YN4y6kkCnU8lb+Wx0Pj+6MDw=='),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='0x0A',
    ENCODING = 'UTF8',
    FIRSTROW = 2
)

D. Muat Parquet atau ORC menggunakan objek format file yang ada

Contoh ini menggunakan kartubebas untuk memuat semua file Parquet di bawah folder.

COPY INTO test_parquet
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
WITH (
    FILE_FORMAT = myFileFormat,
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>')
)

E. Memuat yang menentukan kartubebas dan beberapa file

COPY INTO t1
FROM
'https://myaccount.blob.core.windows.net/myblobcontainer/folder0/*.txt',
    'https://myaccount.blob.core.windows.net/myblobcontainer/folder1'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= '<client_id>@<OAuth_2.0_Token_EndPoint>',SECRET='<key>'),
    FIELDTERMINATOR = '|'
)

F. Memuat menggunakan kredensial MSI

COPY INTO dbo.myCOPYDemoTable
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder0/*.txt'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL = (IDENTITY = 'Managed Identity'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=','
)

G. Muat menggunakan deteksi skema otomatis

COPY INTO [myCOPYDemoTable]
FROM 'https://myaccount.blob.core.windows.net/customerdatasets/folder1/lineitem.parquet'
WITH (
    FILE_TYPE = 'Parquet',
    CREDENTIAL = ( IDENTITY = 'Shared Access Signature',  SECRET='<key>'),
    AUTO_CREATE_TABLE = 'ON'
)

FAQ

Apa performa perintah COPY dibandingkan dengan PolyBase?

Perintah COPY memiliki performa yang lebih baik tergantung pada beban kerja Anda.

  • File terkompresi tidak dapat dipisahkan secara otomatis. Untuk performa pemuatan terbaik, pertimbangkan untuk membagi input Anda menjadi beberapa file saat memuat CSV terkompresi.

  • File CSV besar yang tidak dikompresi dapat dipisahkan dan dimuat secara paralel secara otomatis, sehingga tidak perlu membagi file CSV yang tidak dikompresi secara manual dalam banyak kasus. Dalam kasus tertentu di mana pemisahan file otomatis tidak layak karena karakteristik data, pemisahan CSV besar secara manual mungkin masih menguntungkan performa.

Apa panduan pemisahan file untuk perintah COPY yang memuat file CSV terkompresi?

Panduan tentang jumlah file diuraikan dalam tabel berikut. Setelah jumlah file yang direkomendasikan tercapai, Anda memiliki performa yang lebih baik semakin besar file. Jumlah file ditentukan oleh jumlah simpul komputasi dikalikan dengan 60. Misalnya, pada 6000DWU kami memiliki 12 simpul komputasi dan 12*60 = 720 partisi. Untuk pengalaman pemisahan file sederhana, lihat Cara memaksimalkan throughput beban COPY dengan pemisahan file.

DWU #Files
100 60
200 60
300 60
400 60
500 60
1,000 120
1,500 180
2,000 240
2,500 300
3,000 360
5,000 600
6,000 720
7,500 900
10,000 1200
15,000 1800
30,000 3600

Apa panduan pemisahan file untuk perintah COPY yang memuat file Parquet atau ORC?

Tidak perlu membagi file Parquet dan ORC karena perintah COPY secara otomatis membagi file. File Parquet dan ORC di akun penyimpanan Azure harus 256 MB atau lebih besar untuk performa terbaik.

Apakah ada batasan pada jumlah atau ukuran file?

Tidak ada batasan pada jumlah atau ukuran file; tetapi untuk performa terbaik, kami merekomendasikan file berukuran minimal 4 MB. Selain itu, batasi jumlah file sumber hingga maksimum 5.000 file untuk performa yang lebih baik.

Apakah ada masalah yang diketahui dengan pernyataan COPY?

Jika Anda memiliki ruang kerja Azure Synapse yang dibuat sebelum 7 Desember 2020, Anda mungkin mengalami pesan kesalahan serupa saat mengautentikasi menggunakan Identitas Terkelola: com.microsoft.sqlserver.jdbc.SQLServerException: Managed Service Identity has not been enabled on this server. Please enable Managed Service Identity and try again.

Ikuti langkah-langkah ini untuk mengatasi masalah ini dengan mendaftarkan ulang identitas terkelola ruang kerja:

  1. Pasang Azure PowerShell. Lihat Menginstal PowerShell.
  2. Daftarkan identitas terkelola ruang kerja Anda menggunakan PowerShell:
    Connect-AzAccount
    Select-AzSubscription -SubscriptionId <subscriptionId>
    Set-AzSqlServer -ResourceGroupName your-database-server-resourceGroup -ServerName your-SQL-servername -AssignIdentity
    

Berlaku untuk:Gudang di Microsoft Fabric

Artikel ini menjelaskan cara menggunakan pernyataan COPY di Gudang di Microsoft Fabric untuk memuat dari akun penyimpanan eksternal. Pernyataan COPY memberikan fleksibilitas paling besar untuk penyerapan data throughput tinggi ke gudang Anda, dan sebagai strategi untuk menyerap data ke gudang Anda.

Di Microsoft Fabric, pernyataan COPY (Transact-SQL) saat ini mendukung format file PARQUET dan CSV. Untuk sumber data, akun Azure Data Lake Storage Gen2, dan sumber OneLake didukung.

Untuk informasi selengkapnya tentang penggunaan COPY INTO di Gudang Anda di Microsoft Fabric, lihat Menyerap data ke Gudang Anda menggunakan pernyataan COPY.

Secara default, COPY INTO mengautentikasi sebagai pengguna ID Entra yang mengeksekusi.

Gunakan COPY untuk kemampuan berikut:

  • Gunakan pengguna dengan hak istimewa yang lebih rendah untuk memuat tanpa memerlukan izin CONTROL yang ketat pada gudang data.
  • Jalankan satu pernyataan T-SQL tanpa harus membuat objek database lainnya.
  • Uraikan dan muat file CSV dengan benar di mana pemisah (string, bidang, baris) diloloskan dalam kolom yang dibatasi string.
  • Tentukan model izin yang lebih baik tanpa mengekspos kunci akun penyimpanan menggunakan Share Access Signatures (SAS).
  • Gunakan akun penyimpanan yang berbeda untuk ERRORFILE lokasi (REJECTED_ROW_LOCATION).
  • Kustomisasi nilai default untuk setiap kolom target dan tentukan bidang data sumber untuk dimuat ke dalam kolom target tertentu.
  • Tentukan terminator baris kustom, terminator bidang, dan kutipan bidang untuk file CSV.
  • Tentukan kartubebas dan beberapa file di jalur lokasi penyimpanan.
  • Untuk informasi selengkapnya tentang opsi penyerapan data dan praktik terbaik, lihat Menyerap data ke gudang Anda menggunakan pernyataan COPY.

Syntax

COPY INTO [ warehouse_name. ] [ schema_name. ] table_name
[ (Column_list) ]
FROM '<external_location>' [ , ...n ]
WITH
 (
 [ FILE_TYPE = { 'CSV' | 'PARQUET' } ]
 [ , CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , ERRORFILE = ' [ http(s)://storageaccount/container ] /errorfile_directory [ / ] ] '
 [ , ERRORFILE_CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , MAXERRORS = max_errors ]
 [ , COMPRESSION = { 'Gzip' | 'Snappy' } ]
 [ , FIELDQUOTE = 'string_delimiter' ]
 [ , FIELDTERMINATOR =  'field_terminator' ]
 [ , ROWTERMINATOR = 'row_terminator' ]
 [ , FIRSTROW = first_row ]
 [ , DATEFORMAT = 'date_format' ]
 [ , ENCODING = { 'UTF8' | 'UTF16' } ]
 [ , PARSER_VERSION = { '1.0' | '2.0' } ]
 [ , MATCH_COLUMN_COUNT = { 'ON' | 'OFF' } ]
)

Arguments

warehouse_name

Opsional jika gudang saat ini untuk pengguna yang melakukan operasi adalah gudang tabel yang ditentukan. Jika gudang tidak ditentukan, dan skema serta tabel yang ditentukan tidak ada di gudang saat ini, COPY gagal, dan pesan kesalahan ditampilkan.

schema_name

Opsional jika skema default untuk pengguna yang melakukan operasi adalah skema tabel yang ditentukan. Jika skema tidak ditentukan, dan skema default pengguna yang melakukan COPY operasi berbeda dari skema tabel yang ditentukan, dibatalkan, COPY dan pesan kesalahan ditampilkan.

table_name

Nama tabel untuk COPY data masuk. Tabel target harus sudah ada di gudang.

(column_list)

Daftar opsional dari satu atau beberapa kolom yang digunakan untuk memetakan bidang data sumber ke kolom tabel target untuk memuat data.

column_list harus diapit tanda kurung dan dibatasi oleh koma. Daftar kolom adalah format berikut:

[(Column_name [Default_value default] [Field_number] [,... n])]

  • Column_name - nama kolom dalam tabel target.
  • Default_value - nilai default yang menggantikan nilai apa pun NULL dalam file input. Nilai default berlaku untuk semua format file. COPY mencoba memuat NULL dari file input ketika kolom dihilangkan dari daftar kolom atau ketika ada bidang file input kosong. Nilai default didahului oleh kata kunci 'default'
  • Field_number - Nomor bidang file input yang dipetakan ke kolom target.
  • Pengindeksan bidang dimulai pada 1.

Jika column_list tidak ditentukan, COPY memetakan kolom berdasarkan urutan sumber dan target: Bidang input 1 masuk ke kolom target 1, kolom 2 masuk ke kolom 2, dll.

Note

Saat bekerja dengan file Parquet di Warehouse di Microsoft Fabric, nama kolom harus sama persis di sumber dan tujuan. Jika nama kolom dalam tabel target berbeda dari nama kolom dalam file parquet, kolom tabel target diisi dengan NULL.

Jika daftar kolom tidak ditentukan, COPY memetakan kolom berdasarkan urutan sumber dan target: Bidang input 1 masuk ke kolom target 1, kolom 2 masuk ke kolom 2, dll.

Lokasi eksternal

Menentukan tempat file yang berisi data ditahapkan. Saat ini Azure Data Lake Storage (ADLS) Gen2, Azure Blob Storage, dan OneLake (Pratinjau) didukung:

  • Lokasi eksternal untuk Blob Storage: https://<account\>.blob.core.windows.net/<container\>/<path\>
  • Lokasi eksternal untuk ADLS Gen2: https://<account\>.dfs.core.windows.net/<container\>/<path\>
  • Lokasi eksternal untuk OneLake (Pratinjau): https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/

Azure Data Lake Storage (ADLS) Gen2 menawarkan performa yang lebih baik daripada Azure Blob Storage (warisan). Pertimbangkan untuk menggunakan akun ADLS Gen2 jika memungkinkan.

Note

Titik .blob akhir juga tersedia untuk ADLS Gen2 dan saat ini menghasilkan performa terbaik. Gunakan titik akhir blob saat dfs tidak diperlukan untuk metode autentikasi Anda.

  • Akun - Nama akun penyimpanan

  • Kontainer - Nama kontainer blob

  • Jalur - folder atau jalur file untuk data. Lokasi dimulai dari kontainer. Jika folder ditentukan, COPY mengambil semua file dari folder dan semua subfoldernya. COPY mengabaikan folder tersembunyi dan tidak mengembalikan file yang dimulai dengan garis bawah (_) atau titik (.) kecuali secara eksplisit ditentukan dalam jalur. Perilaku ini sama bahkan ketika menentukan jalur dengan kartubebas.

Kartubebas dapat disertakan dalam jalur di mana

  • Pencocokan nama jalur kartubebas peka huruf besar/kecil
  • Kartubebas dapat diloloskan menggunakan karakter garis miring terbalik (\)

Note

Untuk performa terbaik, hindari menentukan kartubebas yang akan meluas melalui sejumlah besar file. Jika memungkinkan, cantumkan beberapa lokasi file alih-alih menentukan kartubebas.

Beberapa lokasi file hanya dapat ditentukan dari akun penyimpanan dan kontainer yang sama melalui daftar yang dipisahkan koma seperti:

  • https://<account>.blob.core.windows.net/<container\>/<path\>, https://<account\>.blob.core.windows.net/<container\>/<path\>

Lokasi eksternal di belakang firewall

Untuk mengakses file di lokasi Azure Data Lake Storage (ADLS) Gen2 dan Azure Blob Storage yang berada di belakang firewall, prasyarat berikut berlaku:

  • Identitas ruang kerja untuk ruang kerja yang menghosting gudang Anda harus disediakan. Untuk informasi selengkapnya tentang cara menyiapkan identitas ruang kerja, lihat Identitas ruang kerja.
  • Akun ID Entra Anda harus dapat menggunakan identitas ruang kerja.
  • Akun ID Entra Anda harus memiliki akses ke file yang mendasar melalui kontrol akses berbasis peran Azure (RBAC) atau ACL data lake.
  • Ruang kerja Fabric Anda yang menghosting gudang harus ditambahkan sebagai aturan instans sumber daya. Untuk informasi selengkapnya tentang cara menambahkan ruang kerja Fabric Anda dengan aturan instans sumber daya, lihat Aturan instans sumber daya.

FILE_TYPE = { 'CSV' | 'PARKET' }

FILE_TYPE menentukan format data eksternal.

  • CSV: Menentukan file nilai yang dipisahkan koma yang sesuai dengan standar RFC 4180 .
  • PARQUET: Menentukan format Parquet.

KREDENSIAL (IDENTITAS = '', RAHASIA = '')

CREDENTIAL menentukan mekanisme autentikasi untuk mengakses akun penyimpanan eksternal.

Di Gudang Data Fabric:

  • COPY INTO tidak didukung jika akses publik dinonaktifkan.
  • Untuk akun penyimpanan publik, mekanisme autentikasi yang didukung adalah ID Microsoft Entra, Tanda Tangan Akses Bersama (SAS), atau Kunci Akun Penyimpanan (SAK).
  • Untuk akun penyimpanan publik di belakang firewall, autentikasi ID Microsoft Entra adalah satu-satunya metode autentikasi yang didukung. COPY INTO menggunakan OneLake sebagai sumber hanya mendukung autentikasi EntraID.

Autentikasi EntraID pengguna adalah default. Tidak ada kredensial yang perlu ditentukan.

  • Mengautentikasi dengan Tanda Tangan Akses Bersama (SAS)
    • IDENTITY: Konstanta dengan nilai 'Tanda Tangan Akses Bersama'.
    • SECRET: Tanda tangan akses bersama memberikan akses yang didelegasikan ke sumber daya di akun penyimpanan Anda.
    • Izin minimum yang diperlukan: READ dan LIST.
  • Mengautentikasi dengan Kunci Akun Penyimpanan
    • IDENTITY: Konstanta dengan nilai 'Kunci Akun Penyimpanan'.
    • SECRET: Kunci akun penyimpanan.

ERRORFILE = Lokasi Direktori

ERRORFILE hanya berlaku untuk CSV. Menentukan direktori tempat baris yang ditolak dan file kesalahan terkait harus ditulis. Jalur lengkap dari akun penyimpanan dapat ditentukan atau jalur relatif terhadap kontainer dapat ditentukan. Jika jalur yang ditentukan tidak ada, jalur dibuat atas nama Anda. Direktori anak dibuat dengan nama _rejectedrows. Karakter _ memastikan bahwa direktori lolos untuk pemrosesan data lain kecuali dinamai secara eksplisit dalam parameter lokasi.

Note

Ketika jalur relatif diteruskan ke ERRORFILE, jalur relatif terhadap jalur kontainer yang ditentukan dalam external_location.

Dalam direktori ini, ada folder yang dibuat berdasarkan waktu pengiriman beban dalam format YearMonthDay -HourMinuteSecond (misalnya, 20180330-173205). Di folder ini folder dengan ID pernyataan dibuat, dan di bawah folder tersebut dua jenis file ditulis: kesalahan. File Json yang berisi alasan penolakan, dan file row.csv yang berisi baris yang ditolak.

Jika ERRORFILE memiliki jalur lengkap akun penyimpanan yang ditentukan, maka ERRORFILE_CREDENTIAL digunakan untuk menyambungkan ke penyimpanan tersebut. Jika tidak, nilai yang disebutkan untuk INFO MASUK digunakan. Ketika kredensial yang sama yang digunakan untuk data sumber digunakan untuk ERRORFILE, pembatasan yang berlaku untuk ERRORFILE_CREDENTIAL juga berlaku.

Saat menggunakan Akun Azure Storage yang dilindungi firewall, file kesalahan dibuat dalam kontainer yang sama yang ditentukan di jalur akun penyimpanan. Saat mempertimbangkan untuk menggunakan opsi ERRORFILES dalam skenario ini, diperlukan juga untuk menentukan parameter MAXERROR. Jika ERRORFILE memiliki jalur lengkap akun penyimpanan yang ditentukan, maka ERRORFILE_CREDENTIAL digunakan untuk menyambungkan ke penyimpanan tersebut. Jika tidak, nilai yang disebutkan untuk INFO MASUK digunakan.

ERRORFILE_CREDENTIAL = (IDENTITAS = '', RAHASIA = '')

ERRORFILE_CREDENTIAL hanya berlaku untuk file CSV. Pada Gudang di Microsoft Fabric, satu-satunya mekanisme autentikasi yang didukung adalah Shared Access Signature (SAS).

  • Mengautentikasi dengan Tanda Tangan Akses Bersama (SAS)
    • IDENTITY: Konstanta dengan nilai 'Tanda Tangan Akses Bersama'
    • RAHASIA: Tandatanganakses bersama menyediakan akses yang didelegasikan ke sumber daya di akun penyimpanan Anda.
  • Izin minimum yang diperlukan: BACA, DAFTAR, TULIS, BUAT, HAPUS

Note

Jika Anda menggunakan akun penyimpanan yang sama untuk ERRORFILE Anda dan menentukan jalur ERRORFILE relatif terhadap akar kontainer, Anda tidak perlu menentukan ERROR_CREDENTIAL.

MAXERRORS = max_errors

MAXERRORS menentukan jumlah maksimum baris penolakan yang diizinkan dalam beban sebelum COPY operasi gagal. Setiap baris yang COPY tidak dapat diimpor operasi diabaikan dan dihitung sebagai satu kesalahan. Jika max_errors tidak ditentukan, defaultnya adalah 0.

Di Microsoft Fabric, MAXERRORS tidak dapat digunakan saat FILE_TYPE adalah PARQUET.

KOMPRESI = { 'Snappy' | 'GZIP' | 'NONE'}

KOMPRESI bersifat opsional dan menentukan metode kompresi data untuk data eksternal.

  • CSV mendukung GZIP
  • Parquet mendukung GZIP dan Snappy

Perintah mendeteksi COPY otomatis jenis kompresi berdasarkan ekstensi file saat parameter ini tidak ditentukan:

  • .gz - GZIP

Memuat file terkompresi saat ini hanya didukung dengan PARSER_VERSION 1.0.

Perintah ini COPY mengharuskan file gzip tidak berisi sampah di belakang untuk beroperasi secara normal. Format gzip secara ketat mengharuskan file terdiri dari anggota yang valid tanpa informasi tambahan sebelum, antara, atau sesudahnya. Setiap penyimpangan dari format ini, seperti keberadaan data non-gzip di belakang, akan mengakibatkan kegagalan COPY perintah. Pastikan untuk memverifikasi tidak ada sampah di akhir file gzip untuk memastikan COPY berhasil memproses file ini.

FIELDQUOTE = 'field_quote'

FIELDQUOTE hanya berlaku untuk CSV. Menentukan satu karakter yang digunakan sebagai karakter kutipan (pemisah string) dalam file CSV. Jika tidak ditentukan, karakter kuotasi (") digunakan sebagai karakter kutipan seperti yang didefinisikan dalam standar RFC 4180. Notasi heksadesimal juga didukung untuk FIELDQUOTE. Karakter ASCII dan multi-byte yang diperluas tidak didukung dengan UTF-8 untuk FIELDQUOTE.

Note

Karakter FIELDQUOTE diloloskan dalam kolom string di mana ada kehadiran FIELDQUOTE ganda (pemisah).

FIELDTERMINATOR = 'field_terminator'

FIELDTERMINATOR hanya berlaku untuk CSV. Menentukan terminator bidang yang digunakan dalam file CSV. Terminator bidang juga dapat ditentukan menggunakan notasi heksadesimal. Terminator bidang dapat berupa multi-karakter. Terminator bidang default adalah (,). Karakter ASCII dan multi-byte yang diperluas tidak didukung dengan UTF-8 untuk FIELDTERMINATOR.

ROWTERMINATOR = 'row_terminator'

ROWTERMINATOR hanya berlaku untuk CSV. Menentukan terminator baris yang digunakan dalam file CSV. Terminator baris dapat ditentukan menggunakan notasi heksadesimal. Terminator baris dapat berupa multi-karakter. Terminator default adalah \r\n, , \ndan \r.

Perintah mengawali COPY\r karakter saat menentukan \n (baris baru) yang menghasilkan \r\n. Untuk menentukan hanya \n karakter, gunakan notasi heksadesimal (0x0A). Saat menentukan terminator baris multi-karakter dalam heksadesimal, jangan tentukan 0x di antara setiap karakter.

Karakter ASCII dan multi-byte yang diperluas tidak didukung dengan UTF-8 untuk ROWTERMINATOR.

BARIS PERTAMA = First_row_int

FIRSTROW hanya berlaku untuk CSV. Menentukan nomor baris yang dibaca terlebih dahulu di semua file untuk COPY perintah. Nilai mulai dari 1, yang merupakan nilai default. Jika nilai diatur ke dua, baris pertama di setiap file (baris header) dilewati saat data dimuat. Baris dilewati berdasarkan keberadaan terminator baris.

DATEFORMAT = { 'mdy' | 'Dmy' | 'YMD' | 'YDM' | 'MYD' | 'dym' }

DATEFORMAT hanya berlaku untuk CSV dan menentukan format tanggal pemetaan tanggal ke format tanggal SQL Server. Untuk gambaran umum semua jenis dan fungsi data tanggal dan waktu Transact-SQL, lihat Jenis dan Fungsi Data Tanggal dan Waktu (Transact-SQL). DATEFORMAT dalam COPY perintah lebih diutamakan daripada DATEFORMAT yang dikonfigurasi di tingkat sesi.

PENGODEAN = 'UTF8' | 'UTF16'

ENCODING hanya berlaku untuk CSV. Defaultnya adalah UTF8. Menentukan standar pengodean data untuk file yang dimuat oleh COPY perintah.

PARSER_VERSION = { '1.0' | '2.0' }

PARSER_VERSION hanya berlaku untuk CSV. Defaultnya adalah 2.0. Menentukan pengurai file yang digunakan untuk penyerapan ketika jenis file sumber adalah CSV. Parser 2.0 menawarkan peningkatan performa untuk penyerapan file CSV.

Parser versi 2.0 memiliki batasan berikut:

  • File CSV terkompresi tidak didukung
  • File dengan pengodean UTF-16 tidak didukung
  • Multikarakter atau multibyte ROWTERMINATOR, FIELDTERMINATOR, atau FIELDQUOTE tidak didukung. Namun, \r\n diterima sebagai default ROWTERMINATOR.

Saat menggunakan parser versi 1.0 dengan file UTF-8, terminator multibyte dan multicharacter tidak didukung untuk FIELDTERMINATOR.

Parser versi 1.0 hanya tersedia untuk kompatibilitas mundur, dan harus digunakan hanya ketika batasan ini ditemui.

Note

Saat COPY INTO digunakan dengan file CSV terkompresi atau file dengan pengkodean UTF-16, COPY INTO secara otomatis beralih ke PARSER_VERSION 1.0, tanpa memerlukan tindakan pengguna. Untuk terminator multi-karakter pada FIELDTERMINATOR atau ROWTERMINATOR, COPY INTO pernyataan akan gagal. Gunakan PARSER_VERSION = '1.0' jika pemisah multi-karakter diperlukan.

MATCH_COLUMN_COUNT = { 'AKTIF' | 'MATI' }

MATCH_COLUMN_COUNT hanya berlaku untuk CSV. Defaultnya adalah OFF. Menentukan apakah perintah COPY harus memeriksa apakah baris jumlah kolom dalam file sumber cocok dengan jumlah kolom tabel tujuan. Perilaku berikut berlaku:

  • Jika MATCH_COLUMN_COUNTOFF:
    • Melebihi kolom dari baris sumber diabaikan.
    • Baris dengan lebih sedikit kolom disisipkan sebagai null dalam kolom nullable.
    • Jika nilai tidak diberikan ke kolom yang tidak dapat diubah dengan null, perintah gagal COPY .
  • Jika MATCH_COLUMN_COUNTON:
    • Perintah memeriksa COPY apakah jumlah kolom pada setiap baris di setiap file dari sumber cocok dengan jumlah kolom tabel tujuan.
  • Jika ada ketidakcocokan jumlah kolom, perintah gagal COPY .

Note

MATCH_COLUMN_COUNT bekerja secara independen dari MAXERRORS. Ketidakcocokan jumlah kolom menyebabkan COPY INTO gagal terlepas dari MAXERRORS.

Gunakan COPY INTO dengan OneLake

Anda dapat menggunakan COPY INTO untuk memuat data langsung dari file yang disimpan di Fabric OneLake, khususnya dari folder File Fabric Lakehouse. Ini menghilangkan kebutuhan akan akun penahapan eksternal (seperti ADLS Gen2 atau Blob Storage) dan memungkinkan penyerapan asli SaaS yang diatur ruang kerja menggunakan izin Fabric. Fungsionalitas ini mendukung:

  • Membaca dari Files folder di Lakehouses
  • Beban ruang kerja ke gudang dalam penyewa yang sama
  • Penegakan identitas asli menggunakan ID Microsoft Entra

Example:

COPY INTO t1
FROM 'https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/*.csv'
WITH (
    FILE_TYPE = 'CSV',
    FIRSTROW = 2
);

Permissions

Izin sarana kontrol

Untuk menjalankan perintah COPY INTO, pengguna harus diberikan keanggotaan untuk peran ruang kerja melalui Mengelola akses diRuang Kerja , dengan setidaknya peran Penampil. Atau, akses gudang dapat dibagikan dengan pengguna melalui Izin Item di portal Fabric, dengan setidaknya izin Baca. Untuk menyelaraskan dengan prinsip hak istimewa paling sedikit, izin Baca sudah cukup.

Izin sarana data

Setelah pengguna diberikan izin sarana kontrol melalui peran ruang kerja atau izin item, jika mereka hanya memiliki izin Baca di tingkat bidang data , pengguna juga harus diberikan izin INSERT dan ADMINISTER DATABASE BULK OPERATIONS melalui perintah T-SQL.

Misalnya, skrip T-SQL berikut memberikan izin ini kepada pengguna individual melalui ID Microsoft Entra mereka.

GRANT ADMINISTER DATABASE BULK OPERATIONS to [mike@contoso.com];
GO

GRANT INSERT to [mike@contoso.com];
GO

Saat menggunakan opsi ErrorFile, pengguna harus memiliki izin minimal Kontributor Penyimpanan Blob pada kontainer Akun Penyimpanan.

Saat menggunakan OneLake sebagai sumber, pengguna harus memiliki izin Kontributor atau yang lebih tinggi di ruang kerja sumber (tempat Lakehouse berada) dan ruang kerja target (tempat Gudang berada). Semua akses diatur melalui id Microsoft Entra dan peran ruang kerja Fabric.

Remarks

Pernyataan hanya COPY menerima karakter UTF-8 dan UTF-16 yang valid untuk data baris dan parameter perintah. File atau parameter sumber (seperti ROW TERMINATOR atau FIELD TERMINATOR) yang menggunakan karakter tidak valid mungkin salah ditafsirkan oleh COPY pernyataan dan menyebabkan hasil tak terduga seperti kerusakan data, atau kegagalan lainnya. Pastikan file dan parameter sumber Anda sesuai dengan UTF-8 atau UTF-16 sebelum Anda memanggil COPY pernyataan.

Pernyataan ini COPY INTO memiliki batasan pada ukuran kolom varchar(max) dan varbinary(max) individu, serta pada ukuran baris total yang dapat diserap.

  • Parket: ukuran kolom varchar (maks)/varbinary (maks) maksimum 16MB, ukuran baris maks 1GB.
  • CSV: ukuran kolom varchar(max)/varbinary(max) maksimum 1MB, ukuran baris maks 16MB.

Untuk memastikan eksekusi yang andal, file dan folder sumber harus tetap tidak berubah selama durasi COPY INTO operasi.

  • Memodifikasi, menghapus, atau mengganti file atau folder yang direferensikan saat perintah berjalan dapat menyebabkan operasi gagal atau mengakibatkan penyerapan data yang tidak konsisten.
  • Sebelum menjalankan COPY INTO, verifikasi bahwa semua data sumber stabil dan tidak akan diubah selama proses.

Batasan untuk OneLake sebagai sumber

Penyimpanan Fabric OneLake sebagai sumber untuk keduanya COPY INTO dan OPENROWSET(BULK) merupakan fitur pratinjau.

  • Hanya autentikasi ID Microsoft Entra yang didukung. Metode autentikasi lainnya, seperti token SAS, kunci bersama, atau string koneksi, tidak diizinkan.

  • Files Hanya folder Lakehouse yang didukung sebagai sumber. Akses ke subfolder, pintasan, atau lokasi OneLake lainnya saat ini tidak tersedia.

  • Jalur OneLake harus menggunakan ID ruang kerja dan gudang. Nama yang mudah diingat untuk ruang kerja atau Lakehouse tidak didukung saat ini.

  • Izin kontributor diperlukan di kedua ruang kerja. Pengguna yang menjalankan harus memiliki setidaknya peran Kontributor pada ruang kerja Lakehouse sumber dan ruang kerja Gudang target.

Examples

Untuk informasi selengkapnya tentang penggunaan COPY INTO di Gudang Anda di Microsoft Fabric, lihat Menyerap data ke Gudang Anda menggunakan pernyataan COPY.

A. Memuat dari akun penyimpanan publik

Contoh berikut adalah bentuk COPY perintah yang paling sederhana, yang memuat data dari akun penyimpanan publik. Untuk contoh ini, COPY default pernyataan cocok dengan format file csv item baris.

COPY INTO dbo.[lineitem]
FROM 'https://unsecureaccount.blob.core.windows.net/customerdatasets/folder1/lineitem.csv'

Nilai default perintah adalah COPY :

  • MAXERRORS = 0

  • COMPRESSION default tidak terkompresi

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Important

COPY memperlakukan \n sebagai \r\n internal. Untuk informasi selengkapnya, lihat bagian ROWTERMINATOR .

  • FIRSTROW = 1

  • ENCODING = 'UTF8'

  • FILE_TYPE = 'CSV'

B. Memuat autentikasi melalui Share Access Signature (SAS)

Contoh berikut memuat file yang menggunakan umpan baris sebagai terminator baris seperti output UNIX. Contoh ini juga menggunakan kunci SAS untuk mengautentikasi ke Azure Blob Storage.

COPY INTO test_1
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='?sv=2018-03-28&ss=bfqt&srt=sco&sp=rl&st=2016-10-17T20%3A14%3A55Z&se=2021-10-18T20%3A19%3A00Z&sig=IEoOdmeYnE9%2FKiJDSHFSYsz4AkNa%2F%2BTx61FuQ%2FfKHefqoBE%3D'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0X0A',
    ENCODING = 'UTF8',
    MAXERRORS = 10,
    ERRORFILE = '/errorsfolder'--path starting from the storage container
)

C. Muat dengan daftar kolom dengan nilai default yang mengautentikasi melalui Kunci Akun Penyimpanan (SAK)

Contoh ini memuat file yang menentukan daftar kolom dengan nilai default.

--Note when specifying the column list, input field numbers start from 1
COPY INTO test_1 (Col_one default 'myStringDefault' 1, Col_two default 1 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='<Your_account_key>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='x6RWv4It5F2msnjelv3H4DA80n0PQW0daPdw43jM0nyetx4c6CpDkdj3986DX5AHFMIf/YN4y6kkCnU8lb+Wx0Pj+6MDw=='),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='0x0A',
    ENCODING = 'UTF8',
    FIRSTROW = 2
)

D. Muat Parquet

Contoh ini menggunakan kartubebas untuk memuat semua file Parquet di bawah folder menggunakan ID Entra pengguna yang mengeksekusi.

COPY INTO test_parquet
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
WITH (
    FILE_TYPE = 'PARQUET'
)

E. Memuat yang menentukan kartubebas dan beberapa file

COPY INTO t1
FROM
'https://myaccount.blob.core.windows.net/myblobcontainer/folder0/*.txt',
    'https://myaccount.blob.core.windows.net/myblobcontainer/folder1'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>')
    FIELDTERMINATOR = '|'
)

F. Memuat data dari OneLake (Pratinjau Umum)

COPY INTO t1
FROM 'https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/*.csv'
WITH (
    FILE_TYPE = 'CSV',
    FIRSTROW = 2
);

FAQ

Apa panduan pemisahan file untuk perintah COPY yang memuat file CSV terkompresi?

Pertimbangkan untuk memisahkan file CSV besar, terutama ketika jumlah file kecil, tetapi simpan file minimal 4 MB masing-masing untuk performa yang lebih baik.

Apa panduan pemisahan file untuk perintah COPY yang memuat file Parquet?

Pertimbangkan untuk memisahkan file Parquet besar, terutama ketika jumlah file kecil.

Apakah ada batasan pada jumlah atau ukuran file?

Tidak ada batasan pada jumlah atau ukuran file; tetapi untuk performa terbaik, kami merekomendasikan file berukuran minimal 4 MB.

Metode autentikasi apa yang digunakan saat saya tidak menentukan kredensial?

Secara default, COPY INTO menggunakan ID Entra pengguna yang mengeksekusi.