Bagikan melalui


COPY INTO (Transact-SQL)

Berlaku untuk: Azure Synapse Analytics

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

Catatan

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)
  • Gunakan akun penyimpanan yang berbeda untuk lokasi ERRORFILE (REJECTED_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

Catatan

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:

Catatan

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

Sintaks

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' } ]
)

Argumen

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, 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\>

Catatan

Titik akhir .blob 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

Catatan

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' | 'PARQUET' | '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).

Catatan

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/AAD SAS/KEY SAS/KEY
Azure Data Lake Gen2 SAS/MSI/SERVICE PRINCIPAL/KEY/AAD SAS (blob 1 )/MSI (dfs 2 )/SERVICE PRINCIPAL/KEY/AAD SAS (blob 1 )/MSI (dfs 2 )/SERVICE PRINCIPAL/KEY/AAD

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.

Catatan

  • 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: Tanda tangan akses bersama menyediakan akses yang didelegasikan ke sumber daya di akun penyimpanan Anda.
    • Izin minimum yang diperlukan: READ dan LIST
  • Mengautentikasi dengan Perwakilan Layanan

    • IDENTITY: <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.

Catatan

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 = (IDENTITY= '', SECRET = '')

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

  • Azure Blob Storage - SAS/SERVICE PRINCIPAL/AAD

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

  • Mengautentikasi dengan Tanda Tangan Akses Bersama (SAS)

    • IDENTITY: Konstanta dengan nilai 'Tanda Tangan Akses Bersama'
    • RAHASIA: Tanda tangan akses 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

    • IDENTITY: <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

Catatan

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.

Catatan

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 akan gagal, 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 – Snappy
  • .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.

Catatan

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.

FIRSTROW = 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. Azure Synapse Analytics secara otomatis menetapkan nilai unik berdasarkan nilai benih dan kenaikan yang ditentukan selama pembuatan tabel. 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.

AUTO_CREATE_TABLE = { 'ON' | 'OFF' }

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 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.

Catatan

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

Jangan muat ke dalam tabel terdistribusi hash dari file Parquet menggunakan COPY INTO dengan AUTO_CREATE_TABLE = 'ON'.

Jika file Parquet akan dimuat ke dalam tabel terdistribusi hash menggunakan COPY INTO, muat ke dalam tabel penahapan round robin diikuti dengan INSERT ... SELECT dari tabel tersebut ke tabel terdistribusi hash target.

Izin

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];

Keterangan

Pernyataan COPY hanya menerima karakter valid UTF-8 dan UTF-16 untuk data baris dan parameter perintah. File sumber atau parameter (seperti TERMINATOR BARIS atau TERMINATOR BIDANG) yang menggunakan karakter yang tidak valid dapat ditafsirkan dengan salah 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.

Contoh

J. Memuat dari akun penyimpanan publik

Contoh berikut adalah bentuk paling sederhana dari perintah COPY, 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 = Session DATEFORMAT

  • MAXERRORS = 0

  • COMPRESSION default is uncompressed

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Penting

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

  • FIRSTROW = 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.

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, hanya akun Azure Data Lake Storage Gen2 yang didukung.

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

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

Catatan

Untuk Azure Synapse Analytics, kunjungi COPY INTO untuk Azure Synapse Analytics.

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 lokasi ERRORFILE (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.

Sintaks

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 ]
 [ , ENCODING = { 'UTF8' | 'UTF16' } ]
 [ , PARSER_VERSION = { '1.0' | '2.0' } ]
)

Argumen

warehouse_name

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

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, COPY dibatalkan, dan pesan kesalahan dikembalikan.

table_name

Nama tabel yang akan diSALIN datanya. 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 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 didahului oleh kata kunci 'default'
  • Field_number - Nomor bidang file input yang dipetakan ke kolom target.
  • Pengindeksan bidang dimulai pada 1.

Saat column_list 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.

Catatan

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.

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

Catatan

Jalur Fabric OneLake saat ini tidak didukung, hanya akun penyimpanan BLOB dan ADLS Gen2 yang didukung.

Menentukan 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\>

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

Catatan

Titik akhir .blob 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 (\)

Catatan

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' | 'PARQUET' }

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 = '')

INFO MASUK menentukan mekanisme autentikasi untuk mengakses akun penyimpanan eksternal. Pada Gudang di Microsoft Fabric, satu-satunya mekanisme autentikasi yang didukung adalah Tanda Tangan Akses Bersama (SAS) dan Kunci Akun Penyimpanan (SAK). Autentikasi EntraID pengguna adalah default, tidak ada kredensial yang perlu ditentukan.

Catatan

Saat menggunakan akun penyimpanan publik, KREDENSIAL tidak perlu ditentukan. Secara default, ID Entra pengguna yang dijalankan digunakan.

  • Mengautentikasi dengan Tanda Tangan Akses Bersama (SAS)

    • IDENTITY: Konstanta dengan nilai 'Tanda Tangan Akses Bersama'
    • RAHASIA: Tanda tangan akses bersama menyediakan 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'
    • RAHASIA: 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.

Catatan

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.

ERRORFILE_CREDENTIAL = (IDENTITY= '', SECRET = '')

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: Tanda tangan akses bersama menyediakan akses yang didelegasikan ke sumber daya di akun penyimpanan Anda.
    • Izin minimum yang diperlukan: BACA, DAFTAR, TULIS, BUAT, HAPUS

Catatan

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.

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 COPY otomatis memetakan 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 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 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.

Catatan

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 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 ROWTERMINATOR.

FIRSTROW = First_row_int

FIRSTROW hanya berlaku untuk CSV. 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.

PENGODEAN = 'UTF8' | 'UTF16'

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

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
  • ROWTERMINATOR multicharacter atau multibyte, FIELDTERMINATOR, atau FIELDQUOTE tidak didukung. Namun, '\r\n' diterima sebagai ROWTERMINATOR default

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.

Catatan

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

Keterangan

COPY INTO di Gudang tidak mengizinkan pengaturan format tanggal untuk menginterpretasikan string karakter tanggal. Secara default, semua tanggal dianggap memiliki format tahun bulanan. Untuk menyerap file CSV dengan format tanggal yang berbeda, gunakan SET DATEFORMAT untuk menentukan format tanggal yang diinginkan di tingkat sesi. Untuk informasi selengkapnya, lihat MENGATUR DATEFORMAT (Transact-SQL).

Selain itu, pernyataan COPY hanya menerima karakter valid UTF-8 dan UTF-16 untuk data baris dan parameter perintah. File sumber atau parameter (seperti TERMINATOR BARIS atau TERMINATOR BIDANG) yang menggunakan karakter yang tidak valid dapat ditafsirkan dengan salah 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.

Contoh

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

J. Memuat dari akun penyimpanan publik

Contoh berikut adalah bentuk paling sederhana dari perintah COPY, 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'

Nilai default perintah COPY adalah:

  • MAXERRORS = 0

  • COMPRESSION default is uncompressed

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Penting

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

  • FIRSTROW = 1

  • PENGODEAN = '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 EntraID 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 = '|'
)

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 INTRO akan menggunakan ID Entra pengguna yang mengeksekusi.