COPIA IN (Transact-SQL)

Si applica a:Azure Synapse Analytics

Tip

Microsoft Fabric Data Warehouse è un data warehouse relazionale su scala aziendale su una base data lake, con un'architettura futura, un'intelligenza artificiale predefinita e nuove funzionalità. Se non si ha familiarità con il data warehousing, iniziare con Fabric Data Warehouse. I carichi di lavoro esistenti del pool SQL dedicated possono eseguire l'aggiornamento a Fabric per accedere a nuove funzionalità tra data science, analisi in tempo reale e creazione di report.

Questo articolo illustra come usare l'istruzione /> COPY dichiarazione offre la massima flessibilità per l'ingestione dati ad alto throughput in Azure Synapse Analytics.

Note

Per Warehouse in Microsoft Fabric, vedere COPY INTO.

Utilizzo COPY per le seguenti funzionalità:

  • Usare utenti con privilegi inferiori per caricare i dati senza richiedere autorizzazioni CONTROL rigorose per il data warehouse.
  • Eseguire una singola istruzione T-SQL senza dover creare altri oggetti di database.
  • Analizzare e caricare correttamente i file CSV in cui i delimitatori (stringa, campo, riga) vengono preceduti da un carattere di escape all'interno di colonne delimitate da stringhe.
  • Specificare un modello di autorizzazione più fine senza esporre le chiavi dell'account di archiviazione usando firme di accesso condiviso.
  • Usa un account di archiviazione diverso per la ERRORFILE posizione (REJECTED_ROW_LOCATION).
  • Personalizzare i valori predefiniti per ogni colonna di destinazione e specificare i campi dati di origine da caricare in colonne di destinazione specifiche.
  • Specifica un terminatore di riga, un terminatore di campo e una citazione di campo personalizzati per i file CSV.
  • Usare SQL Server formati di data per i file CSV.
  • Specificare caratteri jolly e più file nel percorso di archiviazione.
  • L'individuazione automatica dello schema semplifica il processo di definizione e mapping dei dati di origine nelle tabelle di destinazione.
  • Il processo di creazione automatica delle tabelle crea automaticamente le tabelle e funziona insieme all'individuazione automatica dello schema.
  • Caricare direttamente tipi di dati complessi da file Parquet, ad esempio Mappe ed Elenchi in colonne stringa, senza usare altri strumenti per pre-elaborare i dati.

Note

Per caricare tipi di dati complessi da file Parquet, attivare la creazione automatica della tabella usando AUTO_CREATE_TABLE.

Per esempi completi e guide introduttive sull'uso dell'istruzione COPY , vedere:

Note

Microsoft Entra ID era precedentemente conosciuto come 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

Facoltativo se lo schema predefinito per l'utente che esegue l'operazione è lo schema della tabella specificata. Se non si specifica lo schema e lo schema predefinito dell'utente che esegue l'operazione COPY è diverso dallo schema della tabella specificata, l'operazione COPY viene annullata e viene restituito un messaggio di errore.

nome_tabella

Nome della tabella in cui copiare i dati. La tabella di destinazione può essere temporanea o permanente e deve già esistere nel database. Per la modalità di rilevamento automatico dello schema, non fornire un elenco di colonne.

(column_list)

Elenco facoltativo di una o più colonne utilizzate per eseguire il mapping dei campi dati di origine alle colonne della tabella di destinazione per il caricamento dei dati.

Non specificare un column_list quando AUTO_CREATE_TABLE = 'ON'.

Il valore di column_list deve essere racchiuso tra parentesi e delimitato da virgole. L'elenco di colonne ha il formato seguente:

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

  • Column_name - Nome della colonna nella tabella di destinazione.
  • Default_value: valore predefinito che sostituisce qualsiasi valore NULL nel file di input. Il valore predefinito si applica a tutti i formati di file. COPY tenta di caricare NULL dal file di input quando una colonna viene omessa dall'elenco di colonne o quando è presente un campo di file di input vuoto. Il valore predefinito precede la parola chiave 'default'
  • Field_number: numero di campo del file di input mappato alla colonna di destinazione.
  • L'indicizzazione del campo inizia da 1.

Quando non si specifica un elenco di colonne, COPY esegue il mapping delle colonne in base all'ordine di origine e di destinazione: il campo di input 1 passa alla colonna 1 di destinazione, il campo 2 passa alla colonna 2 e così via.

Posizioni esterne

Percorso in cui vengono gestiti i file contenenti i dati. Attualmente sono supportati Azure Data Lake Storage (ADLS) Gen2 e Archiviazione BLOB di Azure:

  • Percorso esterno per l'archiviazione BLOB: https://<account\>.blob.core.windows.net/<container\>/<path\>
  • Percorso esterno per ADLS Gen2: https://<account\>.dfs.core.windows.net/<container\>/<path\>

Note

L'endpoint .blob è disponibile anche per ADLS Gen2 e attualmente offre le migliori prestazioni. Usare l'endpoint .blob quando .dfs non è necessario per il metodo di autenticazione.

  • Account - Nome dell'account di archiviazione

  • Contenitore - Nome del contenitore BLOB

  • Percorso - Percorso di file o cartella per i dati. Il percorso inizia dal contenitore. Se si specifica una cartella, COPY recupera tutti i file dalla cartella e tutte le relative sottocartelle. COPY ignora le cartelle nascoste e non restituisce file che iniziano con una sottolineatura (_) o un punto (.) a meno che non venga specificato in modo esplicito nel percorso. Questo comportamento è identico anche quando si specifica un percorso con un carattere jolly.

È possibile includere caratteri jolly nel percorso in cui:

  • Per la corrispondenza del nome del percorso con un carattere jolly viene fatta distinzione tra maiuscole e minuscole
  • È possibile eseguire l'escape di un carattere jolly usando il carattere barra rovesciata (\)
  • L'espansione del carattere jolly viene applicata in modo ricorsivo. Ad esempio, tutti i file CSV in Customer1 (incluse le sottodirectory di Customer1) vengono caricati nell'esempio seguente: Account/Container/Customer1/*.csv

Note

Per ottenere prestazioni ottimali, evitare di specificare caratteri jolly che si espandono su un numero maggiore di file. Se possibile, elencare più percorsi di file invece di specificare caratteri jolly.

È possibile specificare più percorsi di file solo dallo stesso account di archiviazione e contenitore tramite un elenco delimitato da virgole, ad esempio:

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

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

FILE_TYPE specifica il formato dei dati esterni.

  • CSV: specifica un file di valori delimitati da virgole conforme allo standard RFC 4180 .
  • PARQUET: specifica un formato Parquet.
  • ORC: specifica un formato ORC (Optimized Row Columnar).

Note

Il tipo di file "Testo delimitato" in PolyBase viene sostituito dal formato di file "CSV". È possibile configurare il delimitatore virgola predefinito tramite il FIELDTERMINATOR parametro .

FILE_FORMAT = external_file_format_name

FILE_FORMAT si applica solo ai file Parquet e ORC. Specifica il nome dell'oggetto formato di file esterno che archivia il tipo di file e il metodo di compressione per i dati esterni. Per creare un formato di file esterno, usare CREATE EXTERNAL FILE FORMAT.

CREDENTIAL (IDENTITY = '', SECRET = '')

CREDENTIAL Specifica il meccanismo di autenticazione per accedere all'account di archiviazione esterno. I metodi di autenticazione sono i seguenti:

CSV Parquet ORC
Archiviazione BLOB di Azure SAS/MSI/PRINCIPALE DEL SERVIZIO/CHIAVE/Entra SAS/KEY SAS/KEY
Azure Data Lake Gen2 SAS/MSI/PRINCIPALE DEL SERVIZIO/CHIAVE/Entra FIRMA di accesso condiviso (BLOB 1 )/MSI (dfs 2 )/ENTITÀ SERVIZIO/KEY/Entra FIRMA di accesso condiviso (BLOB 1 )/MSI (dfs 2 )/ENTITÀ SERVIZIO/KEY/Entra

1 L'endpoint blob (.blob.core.windows.net) nel percorso esterno è necessario per questo metodo di autenticazione.

2 L'endpoint dfs (.dfs.core.windows.net) nel percorso esterno è necessario per questo metodo di autenticazione.

Note

  • Quando si esegue l'autenticazione usando Microsoft Entra ID o un account di archiviazione pubblico, non è necessario specificare CREDENTIAL.
  • Se l'account di archiviazione è associato a una rete virtuale, è necessario eseguire l'autenticazione usando un'identità gestita.
  • Autenticazione con firme di accesso condiviso (SAS)

    • IDENTITY: costante con un valore di Shared Access Signature
    • SECRET: la firma di accesso condiviso fornisce l'accesso delegato alle risorse nell'account di archiviazione.
  • Autorizzazioni minime necessarie: READ e LIST

  • Autenticazione con entità servizio

    • IDENTITY: <ClientID>@<OAuth_2.0_Token_EndPoint>
    • SECRET: chiave dell'entità servizio dell'applicazione Microsoft Entra
  • Ruoli di controllo degli accessi in base al ruolo minimi necessari: Collaboratore ai dati dei BLOB di archiviazione, Collaboratore ai dati dei BLOB di archiviazione, Proprietario dei dati dei BLOB di archiviazione o Lettore di dati BLOB di archiviazione

  • Autenticazione con chiave dell'account di archiviazione

    • IDENTITY: costante con un valore di Storage Account Key
    • SECRET: chiave dell'account di archiviazione
  • Autenticazione con identità gestita (endpoint servizio di rete virtuale)

    • IDENTITY: costante con un valore di Managed Identity
  • Ruoli minimi di controllo degli accessi in base al ruolo necessari: Collaboratore ai dati dei BLOB di archiviazione o Proprietario dei dati BLOB di archiviazione per il server logico registrato da Microsoft Entra in Azure. Quando si usa un pool SQL dedicato (in precedenza SQL Data Warehouse) che non è associato a un'area di lavoro Synapse, questo ruolo controllo degli accessi in base al ruolo non è obbligatorio, ma l'identità gestita richiede autorizzazioni Controllo di accesso List (ACL) per gli oggetti di destinazione per abilitare l'accesso in lettura ai file di origine.

  • Autenticazione con un utente di Microsoft Entra

    • CREDENTIAL non è obbligatorio
  • Ruoli di controllo degli accessi in base al ruolo minimi richiesti: Collaboratore ai dati dei BLOB di archiviazione o Proprietario dei dati BLOB di archiviazione per l'utente Di Microsoft Entra

ERRORFILE = Percorso directory

ERRORFILE si applica solo a CSV. Specifica la directory all'interno dell'istruzione COPY in cui vengono scritte le righe rifiutate e il file di errore corrispondente. È possibile specificare il percorso completo dall'account di archiviazione o dal percorso relativo al contenitore. Se il percorso specificato non esiste, ne crea uno. Viene creata una directory figlio con il nome _rejectedrows. Il _ carattere garantisce che la directory venga preceduta da un carattere di escape per altre elaborazioni dati, a meno che non venga specificato in modo esplicito nel parametro location.

Note

Quando si passa un percorso relativo a ERRORFILE, impostarlo in relazione al percorso del contenitore specificato in external_location.

All'interno di questa directory, il warehouse crea una cartella in base al tempo di invio del carico nel formato YearMonthDay -HourMinuteSecond (ad esempio, 20180330-173205). In questa cartella il processo scrive due tipi di file: il file motivo (errore) e il file di dati (riga). Ogni file antepone il queryIDGUID di file , distributionIDe . Poiché i dati e il motivo si trovano in file distinti, i file corrispondenti hanno un prefisso corrispondente.

Se ERRORFILE ha il percorso completo dell'account di archiviazione definito, COPY usa ERRORFILE_CREDENTIAL per connettersi a tale risorsa di archiviazione. In caso contrario, usa il valore specificato per CREDENTIAL. Quando si usano le stesse credenziali per i dati di origine e ERRORFILE, le restrizioni applicabili si applicano ERRORFILE_CREDENTIAL anche.

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

ERRORFILE_CREDENTIAL si applica solo ai file CSV. Le origini dati e i metodi di autenticazione supportati sono i seguenti:

  • Archiviazione BLOB di Azure: firma di accesso condiviso, entità servizio o Microsoft Entra

  • Azure Data Lake Gen2: firma di accesso condiviso, identità del servizio gestita, entità servizio o Microsoft Entra

  • Autenticazione con firme di accesso condiviso (SAS)

    • IDENTITY: costante con un valore di Shared Access Signature
    • SECRET: la firma di accesso condiviso fornisce l'accesso delegato alle risorse nell'account di archiviazione.
  • Autorizzazioni minime necessarie: READ, LIST, WRITE, CREATE, DELETE

  • Autenticazione con entità servizio

    • IDENTITY: <ClientID>@<OAuth_2.0_Token_EndPoint>
    • SECRET: chiave dell'entità servizio dell'applicazione Microsoft Entra
  • Ruoli controllo degli accessi in base al ruolo minimi necessari: Collaboratore ai dati dei BLOB di archiviazione o Proprietario dei dati BLOB di archiviazione

Note

Usare l'endpoint di token OAuth 2.0 V1

  • Autenticazione con identità gestita (endpoint servizio di rete virtuale)

    • IDENTITY: costante con un valore di Managed Identity
  • Ruoli minimi di controllo degli accessi in base al ruolo necessari: Collaboratore ai dati dei BLOB di archiviazione o Proprietario dei dati BLOB di archiviazione per il server database SQL registrato da Microsoft Entra

  • Autenticazione con un utente di Microsoft Entra

    • CREDENTIAL non è obbligatorio
  • Ruoli di controllo degli accessi in base al ruolo minimi richiesti: Collaboratore ai dati dei BLOB di archiviazione o Proprietario dei dati BLOB di archiviazione per l'utente Di Microsoft Entra

L'uso di una chiave dell'account di archiviazione con ERRORFILE_CREDENTIAL non è supportato.

Note

Se si usa lo stesso account di archiviazione per il file di errore e si specifica il ERRORFILE percorso relativo alla radice del contenitore, non è necessario specificare .ERROR_CREDENTIAL

MAXERRORS = max_errors

MAXERRORS specifica il numero massimo di righe di rifiuto consentite nel carico prima che l'operazione COPY non riesca. Ogni riga che l'operazione COPY non può importare viene ignorata e conteggiata come un errore. Se non si specifica un valore per il numero massimo di errori, il valore predefinito è 0.

MAXERRORS non può essere usato con AUTO_CREATE_TABLE.

Quando FILE_TYPE è PARQUET, le eccezioni causate da errori di conversione del tipo di dati (ad esempio, binario Parquet in integer SQL) causano COPY INTO comunque errori, ignorando MAXERRORS.

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

COMPRESSION è facoltativo e specifica il metodo di compressione dei dati per i dati esterni.

  • CSV supporta GZIP.
  • Parquet supporta GZIP e Snappy.
  • Il formato ORC supporta DefaultCodec e Snappy
  • Zlib è la compressione predefinita per ORC.

Il comando COPY rileva automaticamente il tipo di compressione in base all'estensione di file quando non si specifica questo parametro:

  • .gz - GZIP
  • .snappy - Scattanti
  • .deflate - DefaultCodec (solo Parquet e ORC)

Il comando COPY richiede che i file gzip non contengano alcun garbage finale per funzionare normalmente. Il formato gzip richiede rigorosamente che i file siano costituiti da membri validi senza informazioni aggiuntive prima, tra o dopo di esse. Qualsiasi deviazione da questo formato, ad esempio la presenza di dati finali non gzip, genera l'errore del comando COPY. Per assicurarsi che l'esecuzione di COPY venga eseguita correttamente, assicurarsi di verificare che non siano presenti operazioni di garbage finali alla fine dei file gzip.

FIELDQUOTE = 'field_quote'

FIELDQUOTE si applica a CSV e specifica un singolo carattere usato come carattere di virgolette (delimitatore di stringa) nel file CSV. Se non si specifica questo valore, il carattere virgolette (") viene usato come carattere di virgolette come definito nello standard RFC 4180. La notazione esadecimale è supportata anche per FIELDQUOTE. I caratteri ASCII estesi e multibyte non sono supportati con UTF-8 per FIELDQUOTE.

Note

I caratteri FIELDQUOTE vengono preceduti da un carattere di escape nelle colonne stringa in cui è presente un valore FIELDQUOTE (delimitatore) double.

FIELDTERMINATOR = 'field_terminator'

FIELDTERMINATOR si applica solo a CSV. Specifica il carattere di terminazione del campo usato nel file CSV. È possibile specificare il carattere di terminazione del campo usando la notazione esadecimale. Il carattere di terminazione del campo può essere multicaracter. Il carattere di terminazione del campo predefinito è (,). I caratteri ASCII estesi e multibyte non sono supportati con UTF-8 per FIELDTERMINATOR.

ROWTERMINATOR = 'row_terminator'

ROWTERMINATOR si applica solo a CSV. Specifica il carattere di terminazione della riga usato nel file CSV. È possibile specificare il terminatore di riga usando la notazione esadecimale. Il carattere di terminazione della riga può essere multicharacter. Per impostazione predefinita, il carattere di terminazione della riga è \r\n.

Il comando COPY antepone il \r carattere quando si \n specifica (nuova riga) con conseguente \r\n. Per specificare solo il carattere, usare la \n notazione esadecimale (0x0A). Quando si specificano caratteri di terminazione di riga a più caratteri in formato esadecimale, non specificare 0x tra ogni carattere.

I caratteri ASCII estesi e multibyte non sono supportati con UTF-8 per ROWTERMINATOR.

FIRSTROW = First_row_int

FIRSTROW si applica a CSV e specifica il numero di riga letto per primo in tutti i file per il comando COPY. I valori iniziano da 1, ovvero il valore predefinito. Se si imposta il valore su 2, la prima riga di ogni file (riga di intestazione) viene ignorata quando vengono caricati i dati. Le righe vengono ignorate in base alla presenza di caratteri di terminazione della riga.

DATEFORMAT = { 'mdy' | 'dmy' | 'ymd' | 'ydm' | 'myd' | 'dym' }

DATEFORMAT si applica solo al formato CSV e specifica il formato di data per il mapping della data ai formati di data di SQL Server. Per una panoramica di tutte le funzioni e i tipi di dati di data e ora Transact-SQL, vedere Funzioni e tipi di dati di data e ora (Transact-SQL). DATEFORMAT all'interno del comando COPY ha la precedenza su DATEFORMAT configurato a livello di sessione.

ENCODING = 'UTF8' | 'UTF16'

ENCODING si applica solo a CSV. L'impostazione predefinita è UTF8. Specifica lo standard di codifica dei dati per i file caricati tramite il comando COPY.

IDENTITY_INSERT = 'ON' | 'OFF'

IDENTITY_INSERT specifica se il valore Identity o i valori nel file di dati importati devono essere utilizzati per la colonna Identity. Se IDENTITY_INSERT è OFF (impostazione predefinita), i valori Identity per questa colonna vengono verificati, ma non importati. Si noti il comportamento seguente con il comando COPY:

  • Se IDENTITY_INSERT è OFF e la tabella ha una colonna Identity
    • È necessario specificare un elenco di colonne che non esegue il mapping di un campo di input alla colonna Identity.
  • Se IDENTITY_INSERT è ON e la tabella ha una colonna Identity
    • Se si passa un elenco di colonne, è necessario eseguire il mapping di un campo di input alla colonna Identity.
  • Il valore predefinito non è supportato per la colonna IDENTITY nell'elenco di colonne.
  • È possibile impostare IDENTITY_INSERT per una sola tabella alla volta.

Azure Synapse Analytics assegna automaticamente valori univoci in base ai valori di inizializzazione e incremento specificati durante la creazione della tabella.

AUTO_CREATE_TABLE = { 'ON' | 'OFF' }

AUTO_CREATE_TABLE specifica se la tabella può essere creata automaticamente usando l'individuazione automatica dello schema. AUTO_CREATE_TABLE è disponibile solo per i file Parquet in Azure Synapse Analytics.

  • ON: abilita la creazione automatica della tabella. Il COPY INTO processo crea automaticamente una nuova tabella individuando la struttura del file da caricare. È anche possibile usarlo con le tabelle preesistenti per sfruttare l'individuazione automatica dello schema dei file Parquet.
  • OFF: la creazione automatica della tabella non è abilitata. Default.

Note

La creazione automatica della tabella funziona insieme all'individuazione automatica dello schema. La creazione automatica della tabella non è abilitata per impostazione predefinita.

Permissions

L'utente che esegue il comando COPY deve disporre delle autorizzazioni seguenti:

Sono necessarie le autorizzazioni INSERT e ADMINISTER BULK OPERATIONS. In Azure Synapse Analytics sono necessarie le autorizzazioni INSERT e ADMINISTER DATABASE BULK OPERATIONS.

Inoltre, se l'utente che esegue il comando COPY intende generare una nuova tabella e caricarvi dati, richiedono autorizzazioni CREATE TABLE e ALTER ON SCHEMA.

Ad esempio, per consentire l'uso di mike@contoso.com COPY per creare una nuova tabella nello HR schema e inserire i dati da un file Parquet, usare l'esempio Transact-SQL seguente:

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

L'istruzione COPY accetta solo caratteri validi UTF-8 e UTF-16 per i dati di riga e i parametri dei comandi. L'istruzione COPY potrebbe interpretare erroneamente i file o i parametri di origine (ad esempio ROWTERMINATOR o FIELDTERMINATOR) che usano caratteri non validi e causare risultati imprevisti, ad esempio il danneggiamento dei dati o altri errori. Assicurati che i file sorgente e i parametri siano conformi a UTF-8 o UTF-16 prima di invocare l'istruzione COPY .

L'hint per la MAXDOP query non è supportato con COPY INTO.

Per garantire un'esecuzione affidabile, non modificare i file e le cartelle di origine durante l'operazione COPY INTO .

  • La modifica, l'eliminazione o la sostituzione di file o cartelle a cui si fa riferimento mentre il comando è in esecuzione può causare l'esito negativo dell'operazione o causare l'inserimento di dati incoerente.
  • Prima di eseguire COPY INTO, verificare che tutti i dati di origine siano stabili e non verranno modificati durante il processo.

Se i dati di origine hanno una precisione maggiore rispetto alla definizione di colonna di destinazione, il valore viene troncato, non arrotondato per i tipi numerici, di data e ora.

Examples

A. Eseguire il caricamento da un account di archiviazione pubblico

L'esempio seguente illustra la forma più semplice del COPY comando, che carica i dati da un account di archiviazione pubblico. Per questo esempio, le COPY impostazioni predefinite dell'istruzione corrispondono al formato del file CSV dell'elemento di riga.

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

I valori predefiniti del comando COPY sono i seguenti:

  • DATEFORMAT = Session DATEFORMAT

  • MAXERRORS = 0

  • COMPRESSION il predefinito è non compresso

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Important

COPY Trattano \n come \r\n internamente. Per altre informazioni, vedere la sezione ROWTERMINATOR.

  • FIRSTROW = 1

  • ENCODING = 'UTF8'

  • FILE_TYPE = 'CSV'

  • IDENTITY_INSERT = 'OFF'

B. Eseguire il caricamento con l'autenticazione tramite firma di accesso condiviso

Nell'esempio seguente vengono caricati i file che usano il feed di riga come terminatore di riga, ad esempio un output UNIX. In questo esempio viene usata anche una chiave di firma di accesso condiviso per eseguire l'autenticazione per Archiviazione BLOB di Azure.

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. Eseguire il caricamento con un elenco di colonne con valori predefiniti e con l'autenticazione tramite chiave dell'account di archiviazione

Questo esempio carica i file specificando un elenco di colonne con valori predefiniti.

--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>'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='0x0A',
    ENCODING = 'UTF8',
    FIRSTROW = 2
)

D. Eseguire il caricamento di Parquet o ORC usando un oggetto formato di file esistente

In questo esempio viene usato un carattere jolly per caricare tutti i file Parquet in una cartella.

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. Eseguire il caricamento specificando caratteri jolly e più 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. Eseguire il caricamento con credenziali 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. Eseguire il caricamento con il rilevamento automatico dello schema

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

In che modo le prestazioni del comando COPY vengono confrontate con PolyBase?

Le prestazioni del comando COPY possono essere migliori a seconda del carico di lavoro.

  • Il magazzino non può suddividere automaticamente i file compressi. Per ottenere prestazioni di caricamento ottimali, è consigliabile suddividere l'input in più file durante il caricamento di volumi condivisi cluster compressi.

  • Il warehouse può suddividere automaticamente file CSV non compressi di grandi dimensioni per il caricamento parallelo, quindi in genere non è necessario suddividere manualmente i file CSV non compressi. In alcuni casi in cui la suddivisione automatica dei file non è fattibile a causa delle caratteristiche dei dati, la suddivisione manuale di volumi condivisi cluster di grandi dimensioni potrebbe comunque migliorare le prestazioni.

Qual è il materiale sussidiario sulla suddivisione dei file per il comando COPY che carica i file CSV compressi?

Nella tabella seguente viene descritto il numero di file da usare. Quando si raggiunge il numero consigliato di file, si ottengono prestazioni migliori con file di dimensioni maggiori. Il numero di file è determinato dal numero di nodi di calcolo moltiplicati per 60. Ad esempio, a 6000 DWU sono presenti 12 nodi di calcolo, quindi sono presenti 12 * 60 = 720 partizioni. Per una semplice esperienza di suddivisione dei file, vedere Come ottimizzare la velocità effettiva del caricamento COPY con suddivisioni di file.

DWU Numero di file
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

Quali sono le linee guida per la divisione in file per il comando COPY che carica file Parquet o ORC?

Non è necessario dividere i file Parquet e ORC perché il comando COPY suddivide automaticamente i file. Per ottenere prestazioni ottimali, i file Parquet e ORC nell'account di archiviazione Azure devono essere di 256 MB o superiori.

Sono previste limitazioni per il numero o le dimensioni dei file?

Non esistono limitazioni per il numero o le dimensioni dei file. Tuttavia, per ottenere prestazioni ottimali, usare file di almeno 4 MB. Limitare inoltre il numero di file di origine a un massimo di 5.000 file per ottenere prestazioni migliori.

Esistono problemi noti con l'istruzione COPY?

Se si dispone di un'area di lavoro Azure Synapse creata prima del 7 dicembre 2020, è possibile che si verifichi un messaggio di errore simile durante l'autenticazione tramite Identità gestita: com.microsoft.sqlserver.jdbc.SQLServerException: Managed Service Identity isn't enabled on this server. Please enable Managed Service Identity and try again.

Per risolvere questo problema, registrare nuovamente l'identità gestita dell'area di lavoro:

  1. Installare Azure PowerShell. Vedere Installare PowerShell.
  2. Registrare l'identità gestita dell'area di lavoro usando PowerShell:
    Connect-AzAccount
    Select-AzSubscription -SubscriptionId <subscriptionId>
    Set-AzSqlServer -ResourceGroupName your-database-server-resourceGroup -ServerName your-SQL-servername -AssignIdentity
    

Si applica a:Warehouse in Microsoft Fabric

Questo articolo illustra come usare l'istruzione COPY in Warehouse in Microsoft Fabric per il caricamento da account di archiviazione esterni. L'istruzione COPY offre la massima flessibilità per l'inserimento di dati con velocità effettiva elevata nel data warehouse in Microsoft Fabric ed è la strategia per Ingest data into your Warehouse in Microsoft Fabric.

In Fabric Data Warehouse l'istruzione COPY supporta attualmente i formati di file CSV, JSONL e PARQUET. Per le origini dati, sono supportati gli account Azure Data Lake Storage Gen2 e le origini OneLake.

Per altre informazioni sull'uso COPY INTO del warehouse in Microsoft Fabric, vedere Inserire dati nel warehouse in Microsoft Fabric usando l'istruzione COPY.

Per impostazione predefinita, COPY INTO esegue l'autenticazione come utente Microsoft Entra ID in esecuzione.

Utilizzo COPY per le seguenti funzionalità:

  • Usare utenti con privilegi inferiori per caricare i dati senza richiedere autorizzazioni CONTROL rigorose per il warehouse.
  • Eseguire una singola istruzione T-SQL senza dover creare altri oggetti di database.
  • Analizzare e caricare correttamente i file CSV in cui i delimitatori (stringa, campo, riga) vengono preceduti da un carattere di escape all'interno di colonne delimitate da stringhe.
  • Analizzare e caricare correttamente i file JSONL in cui ogni riga è un oggetto JSON valido e i campi vengono mappati usando espressioni di percorso JSON.
  • Specificare un modello di autorizzazione più fine senza esporre le chiavi dell'account di archiviazione usando firme di accesso condiviso.
  • Usa un account di archiviazione diverso per la ERRORFILE posizione (REJECTED_ROW_LOCATION).
  • Personalizzare i valori predefiniti per ogni colonna di destinazione e specificare i campi dati di origine da caricare in colonne di destinazione specifiche.
  • Specifica un terminatore di riga, un terminatore di campo e una citazione di campo personalizzati per i file CSV.
  • Specificare caratteri jolly e più file nel percorso di archiviazione.
  • Per altre informazioni sulle opzioni di inserimento dati e sulle procedure consigliate, vedere Inserire dati nel warehouse in Microsoft Fabric usando l'istruzione COPY.

Syntax

COPY INTO [ warehouse_name. ] [ schema_name. ] table_name
[ (Column_list) ]
FROM '<external_location>' [ , ...n ]
WITH
 (
 [ FILE_TYPE = { 'CSV' | 'JSONL' | '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

Facoltativo se il magazzino corrente per l'utente che esegue l'operazione è il magazzino della tabella specificata. Se non si specifica warehouse e lo schema e la tabella specificati non esistono nel warehouse corrente, COPY non riesce e viene restituito un messaggio di errore.

schema_name

Facoltativo se lo schema predefinito per l'utente che esegue l'operazione è lo schema della tabella specificata. Se non si specifica lo schema e lo schema predefinito dell'utente che esegue l'operazione COPY è diverso dallo schema della tabella specificata, COPY viene annullato e viene restituito un messaggio di errore.

nome_tabella

Il nome della tabella in cui COPY inserire i dati. La tabella di destinazione deve esistere già nel magazzino.

(column_list)

Elenco facoltativo di colonne utilizzate per eseguire il mapping dei campi dati di origine alle colonne della tabella di destinazione durante il caricamento dei dati.

Il valore di column_list deve essere racchiuso tra parentesi e delimitato da virgole. La sintassi è:

[(Column_name [Default_value predefinito] [Field_number | JSON_path] [,... n])]

  • Column_name - Nome della colonna nella tabella di destinazione.
  • Default_value - il valore predefinito che sostituisce qualsiasi NULL valore nel file di input. Il valore predefinito si applica a tutti i formati di file. COPY Tenta di caricare NULL dal file di input quando una colonna viene omessa dalla lista delle colonne o quando c'è un campo vuoto nel file di input. Il valore predefinito è preceduto dalla parola chiave 'default'
  • Field_number : si applica solo ai file CSV. Specifica la posizione ordinale del campo nei dati di input. L'indicizzazione del campo inizia da 1.
  • JSON_path : si applica solo ai file JSONL. Specifica un'espressione di percorso JSON che identifica il campo da estrarre da ogni oggetto JSON , ad esempio $.CustomerName.

Quando non si specifica column_list, COPY esegue il mapping delle colonne in base all'ordine di origine e di destinazione: il campo di input 1 passa alla colonna 1 di destinazione, il campo 2 passa alla colonna 2 e così via.

Note

Quando si utilizzano file Parquet in Warehouse in Microsoft Fabric, i nomi delle colonne devono corrispondere esattamente all'origine e alla destinazione. Se il nome della colonna nella tabella di destinazione è diverso da quello del nome della colonna nel file parquet, la colonna della tabella di destinazione viene riempita con NULL.

Quando non si specifica un elenco di colonne, COPY esegue il mapping delle colonne in base all'ordine di origine e di destinazione: il campo di input 1 passa alla colonna 1 di destinazione, il campo 2 passa alla colonna 2 e così via.

Posizione esterna

Specifica dove vengono gestiti i file contenenti i dati. Attualmente sono supportati Azure Data Lake Storage (ADLS) Gen2, Archiviazione BLOB di Azure e OneLake:

  • Percorso esterno per l'archiviazione BLOB: https://<account\>.blob.core.windows.net/<container\>/<path\>
  • Percorso esterno per ADLS Gen2: https://<account\>.dfs.core.windows.net/<container\>/<path\>
  • Percorso esterno per OneLake: https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/

Azure Data Lake Storage (ADLS) Gen2 offre prestazioni migliori rispetto ad Archiviazione BLOB di Azure (legacy). Prendere in considerazione l'uso di un account ADLS Gen2 quando possibile.

Note

L'endpoint .blob è disponibile anche per ADLS Gen2 e attualmente offre le migliori prestazioni. Usare l'endpoint blob quando dfs non è necessario per il metodo di autenticazione.

  • Account - Nome dell'account di archiviazione

  • Contenitore - Nome del contenitore BLOB

  • Percorso - Percorso di file o cartella per i dati. Il percorso inizia dal contenitore. Se si specifica una cartella, COPY recupera tutti i file dalla cartella e tutte le relative sottocartelle. COPY ignora le cartelle nascoste e non restituisce file che iniziano con una sottolineatura (_) o un punto (.) a meno che non venga specificato in modo esplicito nel percorso. Questo comportamento è identico anche quando si specifica un percorso con un carattere jolly.

I caratteri jolly possono essere inclusi nel percorso in cui

  • Per la corrispondenza del nome del percorso con un carattere jolly viene fatta distinzione tra maiuscole e minuscole
  • È possibile eseguire l'escape di un carattere jolly usando il carattere barra rovesciata (\)

Note

Per ottenere prestazioni ottimali, evitare di specificare caratteri jolly che si espandono su un numero maggiore di file. Se possibile, elencare più percorsi di file invece di specificare caratteri jolly.

È possibile specificare più percorsi di file solo dallo stesso account di archiviazione e contenitore tramite un elenco delimitato da virgole, ad esempio:

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

Percorsi esterni dietro il firewall

Per accedere ai file in Azure Data Lake Storage (ADLS) Gen2 e nei percorsi di Archiviazione BLOB di Azure protetti da un firewall, si applicano i prerequisiti seguenti:

  • È necessario effettuare il provisioning di un'identità dell'area di lavoro per l'area di lavoro che ospita il warehouse. Per altre informazioni su come configurare un'identità dell'area di lavoro, vedere Identità dell'area di lavoro.
  • L'account Entra ID deve essere in grado di usare l'identità dell'area di lavoro.
  • L'account Entra ID deve avere accesso ai file sottostanti tramite il controllo degli accessi in base al ruolo di Azure o gli ACL del data lake.
  • L'area di lavoro infrastruttura che ospita il warehouse deve essere aggiunta come regola di istanza della risorsa. Per altre informazioni su come aggiungere l'area di lavoro infrastruttura con una regola dell'istanza di risorsa, vedere Regola dell'istanza di risorsa.

FILE_TYPE = { 'CSV' | 'JSONL' | 'PARQUET' }

FILE_TYPE specifica il formato dei dati esterni.

  • CSV: specifica un file di valori delimitati da virgole conforme allo standard RFC 4180 .
  • JSONL: specifica un file JSON (righe JSON) delimitato da nuova riga, in cui ogni riga è un oggetto JSON valido.
  • PARQUET: specifica un formato Parquet.

CREDENTIAL (IDENTITY = '', SECRET = '')

CREDENTIAL Specifica il meccanismo di autenticazione per accedere all'account di archiviazione esterno.

Nel Fabric Data Warehouse:

  • COPY INTO non è supportato se l'accesso pubblico è disabilitato.
  • Per gli account di archiviazione pubblici, i meccanismi di autenticazione supportati sono l'ID Microsoft Entra, la firma di accesso condiviso o la chiave dell'account di archiviazione.
  • Per gli account di archiviazione pubblici protetti da un firewall, l'autenticazione ID Microsoft Entra è l'unico metodo di autenticazione supportato. COPY INTO l'utilizzo di OneLake come origine supporta solo l'autenticazione EntraID.

L'autenticazione Microsoft Entra ID dell'utente è predefinita. Non è necessario specificare credenziali.

  • Autenticazione con firma di accesso condiviso
    • IDENTITY: costante con valore .Shared Access Signature
    • SECRET: la firma di accesso condiviso fornisce l'accesso delegato alle risorse nell'account di archiviazione.
    • Autorizzazioni minime richieste: READ e LIST.
  • Autenticazione con chiave dell'account di archiviazione
    • IDENTITY: costante con valore .Storage Account Key
    • SECRET: chiave dell'account di archiviazione.

ERRORFILE = Percorso directory

ERRORFILE si applica a CSV e JSONL. Specifica la directory in cui devono essere scritte le righe rifiutate e il file di errore corrispondente. È possibile specificare il percorso completo dall'account di archiviazione o dal percorso relativo al contenitore. Se il percorso specificato non esiste, il sistema ne crea uno per conto dell'utente. Viene creata una directory figlio con il nome _rejectedrows. Il _ carattere garantisce che la directory venga preceduta da un carattere di escape per altre elaborazioni dati, a meno che non venga specificato in modo esplicito nel parametro location.

Note

Quando si passa un percorso relativo a ERRORFILE, impostarlo in relazione al percorso del contenitore specificato in external_location.

All'interno di questa directory, il warehouse crea una cartella in base al tempo di invio del carico nel formato YearMonthDay -HourMinuteSecond (ad esempio, 20180330-173205). In questa cartella, il warehouse crea una cartella con l'ID istruzione e, in tale cartella, vengono scritti due tipi di file: un errore. File JSON contenente i motivi di rifiuto e un file row.csv contenente le righe rifiutate.

Se ERRORFILE ha il percorso completo dell'account di archiviazione definito, ERRORFILE_CREDENTIAL viene usato per connettersi a tale archiviazione. In caso contrario, viene usato il valore indicato per CREDENTIAL . Quando vengono usate le stesse credenziali usate per i dati di origine per ERRORFILE, vengono applicate anche restrizioni che si applicano.ERRORFILE_CREDENTIAL

Quando si usa un account di archiviazione di Azure protetto da firewall, il file di errore viene creato nello stesso contenitore specificato nel percorso dell'account di archiviazione. Quando si considera l'uso dell'opzione ERRORFILE in questo scenario, è necessario specificare anche il MAXERROR parametro . Se ERRORFILE ha il percorso completo dell'account di archiviazione definito, ERRORFILE_CREDENTIAL viene usato per connettersi a tale archiviazione. In caso contrario, viene usato il valore indicato per CREDENTIAL .

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

ERRORFILE_CREDENTIAL si applica ai file CSV e JSONL. In Warehouse in Microsoft Fabric, l'unico meccanismo di autenticazione supportato è firma di accesso condiviso (SAS).

  • Autenticazione con firme di accesso condiviso
    • IDENTITY: costante con un valore di Shared Access Signature
    • SECRET: la firma di accesso condiviso fornisce l'accesso delegato alle risorse nell'account di archiviazione.
  • Autorizzazioni minime necessarie: READ, LIST, WRITE, CREATE, DELETE

Note

Se si usa lo stesso account di archiviazione per il file di errore e si specifica il ERRORFILE percorso relativo alla radice del contenitore, non è necessario specificare .ERROR_CREDENTIAL

MAXERRORS = max_errors

MAXERRORS si applica a CSV e JSONL. Specifica il numero massimo di righe di rifiuto consentite nel carico prima che l'operazione COPY non riesca. Ogni riga che l'operazione COPY non può importare viene ignorata e conteggiata come un errore. Se non si specifica un numero massimo di errori, il valore predefinito è 0.

In Fabric Data Warehouse non è possibile usare MAXERRORS quando FILE_TYPE è PARQUET.

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

COMPRESSION è facoltativo e specifica il metodo di compressione dei dati per i dati esterni.

  • CSV supporta GZIP.
  • Parquet supporta GZIP e Snappy.
  • Non supportato per JSONL

Il COPY comando rileva automaticamente il tipo di compressione in base all'estensione del file quando questo parametro non è specificato:

  • .gz - GZIP

Il caricamento di file compressi è attualmente supportato solo con parser versione 1.0.

Il COPY comando richiede che i file gzip non contengano alcun garbage finale per funzionare normalmente. Il formato gzip richiede rigorosamente che i file siano costituiti da membri validi senza informazioni aggiuntive prima, tra o dopo di esse. Qualsiasi deviazione da questo formato, ad esempio la presenza di dati finali non gzip, genera l'errore del COPY comando. Per assicurarsi COPY che l'esecuzione venga eseguita correttamente, assicurarsi di verificare che alla fine dei file gzip non siano presenti operazioni di garbage finali.

FIELDQUOTE = 'field_quote'

FIELDQUOTE si applica solo a CSV. Specifica un singolo carattere utilizzato come carattere di virgolette (delimitatore di stringa) nel file CSV. Se non si specifica FIELDQUOTE, il carattere virgolette (") viene usato come carattere di virgolette come definito nello standard RFC 4180. La notazione esadecimale è supportata anche per FIELDQUOTE. I caratteri ASCII estesi e multibyte non sono supportati con UTF-8 per FIELDQUOTE.

Note

I caratteri FIELDQUOTE vengono preceduti da un carattere di escape nelle colonne stringa in cui è presente un valore FIELDQUOTE (delimitatore) double.

FIELDTERMINATOR = 'field_terminator'

FIELDTERMINATOR si applica solo a CSV. Specifica il carattere di terminazione del campo utilizzato nel file CSV. È anche possibile specificare il carattere di terminazione del campo usando la notazione esadecimale. Il carattere di terminazione del campo può essere multicaracter. Il carattere di terminazione del campo predefinito è una virgola (,). I caratteri ASCII e multibyte estesi non sono supportati con UTF-8 per FIELDTERMINATOR.

ROWTERMINATOR = 'row_terminator'

ROWTERMINATOR si applica solo a CSV. Specifica il carattere di terminazione di riga utilizzato nel file CSV. È possibile specificare il terminatore di riga usando la notazione esadecimale. Il carattere di terminazione della riga può essere multicharacter. I caratteri di terminazione predefiniti sono \r\n, \ne \r.

Il COPY comando prefissa il \r carattere quando specifica \n (nuova linea), risultando in \r\n. Per specificare solo il carattere, usare la \n notazione esadecimale (0x0A). Quando si specificano caratteri di terminazione di riga multicaracter in formato esadecimale, non specificare 0x tra ogni carattere.

I caratteri ASCII estesi e multibyte non sono supportati con UTF-8 per ROWTERMINATOR.

FIRSTROW = First_row_int

FIRSTROW si applica solo a CSV. Specifica il numero di riga che viene letto per primo in tutti i file per il COPY comando. I valori iniziano da 1, ovvero il valore predefinito. Se si imposta il valore su 2, la prima riga di ogni file (riga di intestazione) viene ignorata quando vengono caricati i dati. Le righe vengono ignorate in base alla presenza di caratteri di terminazione della riga.

DATEFORMAT = { 'mdy' | 'dmy' | 'ymd' | 'ydm' | 'myd' | 'dym' }

DATEFORMAT si applica a CSV e JSONL. Specifica il formato della data del mapping delle date ai formati di data SQL Server. Per una panoramica di tutte le funzioni e i tipi di dati di data e ora Transact-SQL, vedere Funzioni e tipi di dati di data e ora (Transact-SQL). DATEFORMAT all'interno del COPY comando ha la precedenza su DATEFORMAT configurato a livello di sessione.

ENCODING = 'UTF8' | 'UTF16'

ENCODING si applica a CSV e JSONL. L'impostazione predefinita è UTF8. Specifica lo standard di codifica dei dati per i file caricati dal COPY comando.

PARSER_VERSION = { '1.0' | '2.0' }

PARSER_VERSION si applica solo ai file CSV. Il valore predefinito è 2,0. PARSER_VERSION specifica il parser di file usato per l'inserimento quando il tipo di file di origine è CSV. Il parser 2.0 offre prestazioni migliorate per l'inserimento di file CSV.

Parser versione 2.0 presenta le limitazioni seguenti:

  • I file CSV compressi non sono supportati.
  • I file con codifica UTF-16 non sono supportati.
  • Multicharacter o multibyte ROWTERMINATOR, FIELDTERMINATORo FIELDQUOTE non è supportato. Tuttavia, \r\n è accettato come predefinito ROWTERMINATOR.

Quando si usa parser versione 1.0 con file UTF-8, i caratteri di terminazione multibyte e multicaracter non sono supportati per FIELDTERMINATOR.

Parser versione 1.0 è disponibile solo per la compatibilità con le versioni precedenti. Usarlo solo quando si riscontrano queste limitazioni.

Note

Quando si usa COPY INTO con file CSV compressi o file con codifica UTF-16, COPY INTO passa automaticamente alla PARSER_VERSION versione 1.0, senza che sia necessaria l'azione dell'utente. Per i caratteri di terminazione multicaracter in FIELDTERMINATOR o ROWTERMINATOR, l'istruzione COPY INTO ha esito negativo. Usare PARSER_VERSION = '1.0' se sono necessari separatori multicaracter.

MATCH_COLUMN_COUNT = { 'ON' | 'OFF' }

MATCH_COLUMN_COUNT si applica solo ai file CSV. Il valore predefinito è OFF. Specifica se il COPY comando deve verificare se il numero di colonne nei file di origine corrisponde al numero di colonne della tabella di destinazione. Si applica il comportamento seguente:

  • Se MATCH_COLUMN_COUNT è OFF:
    • Il comando ignora il superamento delle colonne dalle righe di origine.
      • Il comando inserisce NULL valori in colonne nullable per le righe con un minor numero di colonne.
    • Se non viene fornito un valore a una colonna non nullable, il COPY comando ha esito negativo.
  • Se MATCH_COLUMN_COUNT è ON:
    • Il COPY comando verifica se il conteggio delle colonne su ogni riga di ogni file dalla sorgente corrisponde al conteggio delle colonne della tabella di destinazione.
  • Se è presente una mancata corrispondenza del numero di colonne, il COPY comando ha esito negativo.

Note

MATCH_COLUMN_COUNT funziona indipendentemente da MAXERRORS. Una mancata corrispondenza del numero di MAXERRORScolonne causa COPY INTO un errore indipendentemente da .

Usare COPY INTO con OneLake

Usare COPY INTO per caricare i dati direttamente dai file archiviati nell'Fabric OneLake, in elementi esistenti. Questo metodo elimina la necessità di account di staging esterni, ad esempio ADLS Gen2 o gestione rete virtuale di Azure, e abilita l'inserimento saaS nativo dell'area di lavoro usando le autorizzazioni di Fabric. Questa funzionalità supporta:

  • Lettura da qualsiasi posizione all'interno di un'area di lavoro e di un elemento
  • Carichi da area di lavoro a magazzino all'interno dello stesso tenant
  • Imposizione dell'identità nativa tramite Microsoft Entra ID

Example:

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

Permissions

Autorizzazioni del piano di controllo

Per eseguire il COPY INTO comando, è necessario concedere l'appartenenza a un ruolo dell'area di lavoro tramite Gestisci l'accesso nell'area di lavoro, con almeno il ruolo Visualizzatore. In alternativa, è possibile condividere l'accesso al warehouse con un utente tramite Item Permissions nel portale di Fabric, con almeno autorizzazioni di lettura. Per allinearsi al principio dei privilegi minimi, l'autorizzazione di lettura è sufficiente.

Autorizzazioni del piano dati

Dopo aver concesso le autorizzazioni del piano di controllo tramite ruoli dell'area di lavoro o autorizzazioni per elementi, se l'utente dispone solo delle autorizzazioni di lettura a livello del piano dati, concedere all'utente INSERT e ADMINISTER DATABASE BULK OPERATIONS alle autorizzazioni anche i comandi T-SQL.

Ad esempio, lo script T-SQL seguente concede queste autorizzazioni a un singolo utente usando il relativo Microsoft Entra ID.

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

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

Quando si usa l'opzione del file di errore, l'utente deve disporre dell'autorizzazione minima di gestione rete virtuale di Azure Collaboratore nel contenitore dell'account di archiviazione.

Quando si usa OneLake come origine, l'utente deve avere autorizzazioni di collaboratore o superiore per l'area di lavoro di origine (dove si trova Lakehouse) e l'area di lavoro di destinazione (in cui risiede il warehouse). Microsoft Entra ID e Fabric ruoli dell'area di lavoro regolano tutti gli accessi.

Remarks

L'istruzione COPY accetta solo caratteri validi UTF-8 e UTF-16 per i dati di riga e i parametri dei comandi. Se si usano file o parametri di origine (ad esempio ROWTERMINATOR o FIELDTERMINATOR) che contengono caratteri non validi, l'istruzione COPY potrebbe interpretarle in modo non corretto e causare risultati imprevisti, ad esempio il danneggiamento dei dati o altri errori. Prima di richiamare l'istruzione COPY , assicurarsi che i file e i parametri di origine siano conformi a UTF-8 o UTF-16.

L'istruzione COPY INTO presenta restrizioni sulle dimensioni delle singole colonne varchar(max) e varbinary(max), nonché sulle dimensioni totali delle righe che è possibile inserire.

  • Parquet: dimensione massima della colonna varchar(max)/varbinary(max) di 16 MB, dimensione massima riga 1 GB.
  • CSV e JSONL: dimensione massima della colonna varchar(max)/varbinary(max) di 1 MB, dimensione massima riga 16 MB.

Per garantire un'esecuzione affidabile, non modificare i file e le cartelle di origine durante l'operazione COPY INTO .

  • La modifica, l'eliminazione o la sostituzione di file o cartelle a cui si fa riferimento mentre il comando è in esecuzione può causare l'esito negativo dell'operazione o causare l'inserimento di dati incoerente.
  • Prima di eseguire COPY INTO, verificare che tutti i dati di origine siano stabili e non vengano modificati durante il processo.

Se i dati di origine hanno una precisione maggiore rispetto alla definizione di colonna di destinazione, il valore viene troncato, non arrotondato per i tipi numerici, di data e ora.

Limitazioni per OneLake come origine

  • È supportata solo l'autenticazione MICROSOFT Entra ID. Altri metodi di autenticazione, ad esempio token di firma di accesso condiviso, chiavi condivise o stringhe di connessione, non sono consentiti.

  • Gli elementi del magazzino non sono supportati come percorsi di origine. I file devono provenire da altri elementi di Fabric che espongono file tramite l'archiviazione OneLake.

  • I percorsi di OneLake devono usare GLI ID dell'area di lavoro e del magazzino. I nomi descrittivi per le aree di lavoro o lakehouse non sono attualmente supportati.

  • Le autorizzazioni di collaboratore sono necessarie in entrambe le aree di lavoro. L'utente in esecuzione deve avere almeno il ruolo Collaboratore nell'area di lavoro Lakehouse di origine e nell'area di lavoro Warehouse di destinazione.

Examples

Per altre informazioni sull'uso COPY INTO del warehouse in Microsoft Fabric, vedere Inserire dati nel warehouse in Microsoft Fabric usando l'istruzione COPY.

A. Eseguire il caricamento da un account di archiviazione pubblico

L'esempio seguente illustra la forma più semplice del COPY comando, che carica i dati da un account di archiviazione pubblico. Per questo esempio, le COPY impostazioni predefinite dell'istruzione corrispondono al formato del file CSV dell'elemento di riga.

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

I valori predefiniti del COPY comando sono:

  • MAXERRORS = 0

  • COMPRESSION (il valore predefinito è non compresso)

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

    Important

    COPY Trattano \n come \r\n internamente. Per altre informazioni, vedere la sezione ROWTERMINATOR.

  • FIRSTROW = 1

  • ENCODING = 'UTF8'

  • FILE_TYPE = 'CSV'

B. Eseguire il caricamento con l'autenticazione tramite firma di accesso condiviso

Nell'esempio seguente vengono caricati i file che usano il feed di riga come terminatore di riga, ad esempio un output UNIX. In questo esempio viene usata anche una chiave di firma di accesso condiviso per eseguire l'autenticazione per Archiviazione BLOB di Azure.

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>'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0X0A',
    ENCODING = 'UTF8',
    MAXERRORS = 10,
    ERRORFILE = '/errorsfolder'--path starting from the storage container
)

C. Caricare con un elenco di colonne con valori predefiniti che eseguono l'autenticazione tramite la chiave dell'account di archiviazione (SAK)

Questo esempio carica i file specificando un elenco di colonne con valori predefiniti.

--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>'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='0x0A',
    ENCODING = 'UTF8',
    FIRSTROW = 2
)

D. Caricare Parquet

In questo esempio viene usato un carattere jolly per caricare tutti i file Parquet in una cartella usando il Entra ID dell'utente in esecuzione.

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

E. Caricare JSONL

Questo esempio usa un carattere jolly per caricare tutti i file JSONL in una cartella usando il Entra ID dell'utente in esecuzione.

COPY INTO test_jsonl
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.jsonl'
WITH (
    FILE_TYPE = 'JSONL'
)

F. Eseguire il mapping dei nomi delle colonne ai percorsi dei campi nei documenti JSONL

L'esempio seguente mostra un file JSON Lines (JSONL), in cui ogni riga rappresenta un singolo oggetto JSON:

{"CountryKey": 0, "CountryName": "ALGERIA", "RegionID": 0, "Population": 34800000}
{"CountryKey": 1, "CountryName": "ARGENTINA", "RegionID": 1, "Population": 46044703}
{"CountryKey": 2, "CountryName": "BRAZIL", "RegionID": 1, "Population": 203080756}

In COPY INTOè possibile eseguire il mapping delle colonne di tabella a campi JSON specifici usando espressioni di percorso JSON. Questo mapping consente di inserire solo i campi obbligatori dai dati di origine.

COPY INTO Countries (
  CountryID '$.CountryKey', 
  CountryName '$.CountryName', 
  RegionID '$.RegionKey', 
  Population '$.Population'
)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/countries.jsonl'
WITH (   
    FILE_TYPE = 'JSONL' 
)

G. Caricare i dati specificando caratteri jolly e più 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 = '|'
)

H. Caricare dati da OneLake

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