Inserire dati nel Warehouse usando Transact-SQL

Si applica a:✅ Warehouse in Microsoft Fabric

Il linguaggio Transact-SQL offre opzioni che è possibile usare per caricare i dati su larga scala da tabelle esistenti nel lakehouse e nel warehouse in nuove tabelle del warehouse. Queste opzioni sono utili se è necessario creare nuove versioni di una tabella con dati aggregati, versioni di tabelle con un subset di righe o creare una tabella in seguito a una query complessa. Ora si esamineranno alcuni esempi.

Creare una nuova tabella con il risultato di una query

Warehouse in Microsoft Fabric consente di creare facilmente una nuova tabella basata su un risultato di query T-SQL usando le istruzioni T-SQL seguenti:

  • CREATE TABLE AS SELECT Istruzione CTAS che consente di creare una nuova tabella nel data warehouse dall'output di un'istruzione SELECT.
  • SELECT INTO clausola di query che consente di selezionare i risultati da qualsiasi origine tabella e reindirizzare i risultati in una nuova tabella. Si tratta di una funzionalità standard nel linguaggio T-SQL.

Queste due istruzioni sono simili, quindi gli esempi seguenti sono incentrati sull'istruzione CTAS.

L'istruzione CTAS esegue l'operazione di inserimento nella nuova tabella in parallelo, rendendola estremamente efficiente per la trasformazione dei dati e la creazione di nuove tabelle nell'area di lavoro.

Puoi usare le seguenti opzioni per la parte SELECT dell'istruzione CTAS:

  • Lettura di una tabella di magazzino, ad esempio una tabella di transizione.
  • Lettura di una cartella Lakehouse Delta Lake usando una tabella generata automaticamente nell'endpoint di analisi SQL per Lakehouse.
  • Lettura di file CSV, Parquet o JSONL direttamente da Azure Data Lake o Azure Blob Storage usando la funzione OPENROWSET.

Per caricare un set di dati di esempio, seguire la procedura descritta in Inserire dati nel warehouse usando l'istruzione COPY per creare i dati di esempio nel warehouse.

Creare una tabella dalla tabella Warehouse

Il primo esempio mostra come creare una nuova tabella che rappresenta una copia della tabella esistente dbo.TaxiTrips , ma filtrata in modo da includere solo i dati dell'anno 2023:

CREATE TABLE dbo.TaxiTrips_2023
AS
SELECT * 
FROM dbo.TaxiTrips 
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

Creare una tabella dalla cartella Delta Lake

Le cartelle Delta Lake persistenti in OneLake vengono rappresentate automaticamente come tabelle se sono archiviate nella cartella /Tables in una lakehouse. Il codice seguente crea una nuova tabella TaxiTrips_2023 dalla cartella Delta Lake /Tables/TaxiTrips nel lakehouse MyLakehouse:

CREATE TABLE dbo.TaxiTrips_2023
AS
SELECT * 
FROM MyLakehouse.dbo.TaxiTrips 
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

È possibile fare riferimento alla cartella Delta Lake usando la notazione in tre parti che fa riferimento alla lakehouse in cui sono archiviati i file. Tutti gli esempi illustrati nella sezione precedente sono applicabili alle cartelle Delta Lake.

Creare una tabella dal file CSV/Parquet/JSONL

È anche possibile creare una nuova tabella direttamente da un file esterno usando la OPENROWSET funzione . Ad esempio, il seguente esempio T-SQL usa segnaposto per dimostrare come si potrebbe importare un file Parquet pubblico.

CREATE TABLE dbo.<table_name>
AS
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.parquet') AS data;

È possibile creare una nuova tabella trasformando i dati da un file CSV esterno e disponibile pubblicamente:

CREATE TABLE dbo.<table name>
AS
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.csv') AS data;

In alternativa, è possibile creare una nuova tabella trasformando i dati da un file JSONL esterno disponibile pubblicamente:

CREATE TABLE dbo.<table name>
AS
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.jsonl') AS data;

Inserire dati in tabelle esistenti con query T-SQL

Gli esempi precedenti creano nuove tabelle in base al risultato di una query. Per replicare gli esempi ma su tabelle esistenti, è possibile usare lo schema INSERT ... SELECT.

Inserire dati dalla tabella warehouse

Il codice seguente inserisce nuovi dati da una tabella warehouse in una tabella esistente:

INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM dbo.TaxiTrips
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

I criteri di query per l'istruzione SELECT possono essere qualsiasi query valida, purché i tipi di colonna di query risultanti siano allineati alle colonne nella tabella di destinazione. Se vengono specificati i nomi di colonna e includono solo un subset delle colonne della tabella di destinazione, tutte le altre colonne vengono caricate come NULL. Per altre informazioni, vedere Uso di INSERT INTO...SELECT per eseguire l'importazione bulk dei dati con registrazione minima e parallelismo.

Inserire dati dalla cartella Delta Lake

Le cartelle Delta Lake persistenti in OneLake vengono rappresentate automaticamente come tabelle se sono archiviate in una cartella /Tables in un lakehouse.

Il codice seguente acquisisce nuovi dati dalla sezione della cartella Delta Lake /Tables/TaxiTrips nel lakehouse MyLakehouse*.

INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM MyLakehouse.dbo.TaxiTrips 
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

Inserire dati dal file CSV/Parquet/JSONL

È possibile usare la OPENROWSET funzione come origine per inserire file Parquet, CSV o JSON dall'archiviazione:

INSERT INTO dbo.<table name>
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>') AS data
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

È possibile leggere più file utilizzando caratteri jolly come *.parquet, oppure indirizzando directory partizionate come /year=*/month=*. Per ottimizzare le prestazioni, applicare filtri nella clausola WHERE per eliminare le righe e le partizioni non necessarie durante l'esecuzione della query.

Questo esempio è simile a quello usato nell'inserimento con COPY INTO. Il comando COPY INTO è più semplice da usare, in particolare per i caricamenti semplici dei dati da origine a destinazione. Tuttavia, se è necessario trasformare i dati di origine ,ad esempio la conversione di valori o il join con altre tabelle, l'uso INSERT ... SELECT di offre la flessibilità necessaria per eseguire trasformazioni durante l'inserimento.

Inserire dati da OneLake

È possibile usare la OPENROWSET funzione come origine per inserire dati dall'archiviazione OneLake di Fabric. Sostituire {workspaceId} e {lakehouseId} con i GUID dell'area di lavoro e lakehouse corrispondenti nell'esempio seguente:

INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM OPENROWSET(BULK 'https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{lakehouseId}/Files/year=*/month=*/*.parquet') AS data
WHERE data.filepath(1) = '2023'

Questo esempio si basa su quello precedente che legge i dati da Azure Data Lake Storage. Usare questo approccio quando è necessario trasformare i dati di origine, ad esempio convertendo i valori, unendo con altre tabelle o leggendo partizioni specifiche. In questi casi, l'uso INSERT ... SELECT di offre la flessibilità necessaria per applicare trasformazioni durante l'inserimento dei dati.

Inserire dati da tabelle in magazzini e lakehouse diversi

Per sia CREATE TABLE AS SELECT che INSERT ... SELECT, l'istruzione SELECT può anche fare riferimento a tabelle nei magazzini diversi dal magazzino in cui è archiviata la tabella di destinazione, usando query tra warehouse. A tale scopo, è possibile usare la convenzione di denominazione in tre parti [warehouse_or_lakehouse_name.][schema_name.]table_name. Si supponga, ad esempio, di disporre delle risorse dell’area di lavoro seguenti:

  • Un lakehouse denominato taxi_lakehouse contenente i dati più recenti.
  • Un warehouse denominato reference_warehouse con tabelle utilizzate per i dati di riferimento.
  • Magazzino denominato research_warehouse in cui viene creata la tabella di destinazione.

È possibile creare una nuova tabella che utilizza una denominazione a tre parti per combinare i dati delle tabelle per questi asset dell'area di lavoro.

CREATE TABLE research_warehouse.dbo.taxi_trips
AS
SELECT *
FROM taxi_lakehouse.dbo.TaxiTrips AS latest
INNER JOIN reference_warehouse.dbo.TaxiTrips AS reference
ON latest.vendorId_lpep = reference.vendorId_lpep;

Per altre informazioni sulle query tra data warehouse, vedere Scrivere una query SQL tra database.

Controllare e monitorare l'inserimento T-SQL

Sia le operazioni CTAS che le operazioni INSERT ... SELECT eseguite tramite T-SQL compaiono nella cronologia/attività delle query del warehouse e possono essere monitorate insieme ad altre operazioni del magazzino.

Opzioni di inserimento dati

Altri modi per inserire i dati nel warehouse includono: