Condividi tramite


OPENROWSET BULK (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureEndpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

La OPENROWSET funzione legge i dati da uno o più file e restituisce il contenuto come set di righe. A seconda di un servizio, il file potrebbe essere archiviato in Archiviazione BLOB di Azure, Archiviazione Azure Data Lake, disco locale, condivisioni di rete e così via. È possibile leggere vari formati di file, ad esempio testo/CSV, Parquet o righe JSON.

È OPENROWSET possibile fare riferimento alla FROM funzione nella clausola di una query come se fosse un nome di tabella. Può essere usato per leggere i dati nell'istruzione o per aggiornare i dati di destinazione nelle istruzioni , SELECTUPDATE, INSERT, DELETE, o MERGE .CTASCETAS

  • OPENROWSET(BULK) è progettato per leggere i dati da file di dati esterni.
  • OPENROWSET senza BULK è progettato per la lettura da un altro motore di database. Per altre informazioni, vedere OPENROWSET (Transact-SQL).

Questo articolo e l'argomento impostati in OPENROWSET(BULK) variano tra le piattaforme.

Dettagli e collegamenti a esempi simili su altre piattaforme:

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Per SQL Server, Azure SQL Database, database SQL in Fabric e Azure SQL Managed Instance:

OPENROWSET( BULK 'data_file_path',
            <bulk_option> ( , <bulk_option> )*
)
[
    WITH (  ( <column_name> <sql_datatype> [ '<column_path>' | <column_ordinal> ] )+ )
]

<bulk_option> ::=
   DATA_SOURCE = 'data_source_name' |

   -- file format options
   CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } |
   DATAFILETYPE = { 'char' | 'widechar' } |
   FORMAT = <file_format> |

   FORMATFILE = 'format_file_path' |
   FORMATFILE_DATA_SOURCE = 'data_source_name' |

   SINGLE_BLOB |
   SINGLE_CLOB |
   SINGLE_NCLOB |

   -- Text/CSV options
   ROWTERMINATOR = 'row_terminator' |
   FIELDTERMINATOR =  'field_terminator' |
   FIELDQUOTE = 'quote_character' |

   -- Error handling options
   MAXERRORS = maximum_errors |
   ERRORFILE = 'file_name' |
   ERRORFILE_DATA_SOURCE = 'data_source_name' |

   -- Execution options
   FIRSTROW = first_row |
   LASTROW = last_row |

   ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) [ UNIQUE ] ] |

   ROWS_PER_BATCH = rows_per_batch

Sintassi per Fabric Data Warehouse

OPENROWSET( BULK 'data_file_path',
            <bulk_option> ( , <bulk_option> )*
)
[
    WITH (  ( <column_name> <sql_datatype> [ '<column_path>' | <column_ordinal> ] )+ )
]

<bulk_option> ::=
   DATA_SOURCE = 'data_source_name' |

   -- file format options
   CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } |
   DATAFILETYPE = { 'char' | 'widechar' } |
   FORMAT = <file_format> |

   -- Text/CSV options
   ROWTERMINATOR = 'row_terminator' |
   FIELDTERMINATOR =  'field_terminator' |
   FIELDQUOTE = 'quote_character' |
   ESCAPECHAR = 'escape_char' |
   HEADER_ROW = [true|false] |
   PARSER_VERSION = 'parser_version' |

   -- Error handling options
   MAXERRORS = maximum_errors |
   ERRORFILE = 'file_name' |

   -- Execution options
   FIRSTROW = first_row |
   LASTROW = last_row |

   ROWS_PER_BATCH = rows_per_batch

Arguments

Gli argomenti dell'opzione BULK consentono un controllo significativo sulla posizione in cui iniziare e terminare i dati di lettura, su come gestire gli errori e sul modo in cui i dati vengono interpretati. Ad esempio, è possibile specificare che il file di dati viene letto come set di righe a riga singola, a colonna singola di tipo varbinary, varchar o nvarchar. Il comportamento predefinito viene illustrato nelle descrizioni degli argomenti seguenti.

Per informazioni su come usare l'opzione BULK , vedere la sezione Osservazioni più avanti in questo articolo. Per informazioni sulle autorizzazioni richieste dall'opzione BULK , vedere la sezione Autorizzazioni più avanti in questo articolo.

Per informazioni sulla preparazione dei dati per l'importazione bulk, vedere Preparare i dati per l'esportazione o l'importazione bulk.

BULK 'data_file_path'

Percorso o URI dei file di dati i cui dati devono essere letti e restituiti come set di righe.

L'URI può fare riferimento ad Archiviazione Azure Data Lake o ad Archiviazione BLOB di Azure. URI dei file di dati i cui dati devono essere letti e restituiti come set di righe.

I formati di percorso supportati sono:

  • <drive letter>:\<file path> per accedere ai file sul disco locale
  • \\<network-share\<file path> per accedere ai file nelle condivisioni di rete
  • adls://<container>@<storage>.dfs.core.windows.net/<file path> per accedere ad Azure Data Lake Storage
  • abs://<storage>.blob.core.windows.net/<container>/<file path> per accedere ad Archiviazione BLOB di Azure
  • s3://<ip-address>:<port>/<file path> per accedere all'archiviazione compatibile con s3

Note

Questo articolo e i modelli di URI supportati differiscono per piattaforme diverse. Per i modelli URI disponibili in Microsoft Fabric Data Warehouse, selezionare Infrastruttura nell'elenco a discesa versione.

A partire da SQL Server 2017 (14.x), il data_file può trovarsi in Archiviazione BLOB di Azure. Per esempi, vedere Esempi di accesso in blocco ai dati in Archiviazione BLOB di Azure.

  • https://<storage>.blob.core.windows.net/<container>/<file path> per accedere ad Archiviazione BLOB di Azure o Azure Data Lake Storage
  • https://<storage>.dfs.core.windows.net/<container>/<file path> per accedere ad Azure Data Lake Storage
  • abfss://<container>@<storage>.dfs.core.windows.net/<file path> per accedere ad Azure Data Lake Storage
  • https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/<file path> - per accedere a OneLake in Microsoft Fabric

Note

Questo articolo e i modelli di URI supportati differiscono per piattaforme diverse. Per i modelli URI disponibili in SQL Server, database SQL di Azure e Istanza gestita di SQL di Azure , selezionare il prodotto nell'elenco a discesa versione.

L'URI può includere il * carattere in modo che corrisponda a qualsiasi sequenza di caratteri, consentendo OPENROWSET la corrispondenza tra criteri e URI. Inoltre, può terminare con /** per abilitare l'attraversamento ricorsivo attraverso tutte le sottocartelle. In SQL Server questo comportamento è disponibile a partire da SQL Server 2022 (16.x).

Per esempio:

SELECT TOP 10 *
FROM OPENROWSET(
    BULK '<scheme:>//pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.parquet'
);

I tipi di archiviazione a cui è possibile fare riferimento dall'URI sono illustrati nella tabella seguente:

Versione On-premises Archiviazione di Azure OneLake in tessuto S3 Google Cloud (GCS)
SQL Server 2017 (14.x), SQL Server 2019 (15.x) Yes Yes NO NO NO
SQL Server 2022 (16.x) Yes Yes NO Yes NO
Database SQL di Microsoft Azure NO Yes NO NO NO
Istanza SQL gestita di Azure NO Yes NO NO NO
Serverless SQL pool in Azure Synapse Analytics NO Yes Yes NO NO
Endpoint di analisi DI Microsoft Fabric Warehouse e SQL NO Yes Yes Sì, usando le scorciatoie OneLake in Fabric Sì, usando le scorciatoie OneLake in Fabric
Database SQL su Microsoft Fabric NO Sì, usando le scorciatoie OneLake in Fabric Yes Sì, usando le scorciatoie OneLake in Fabric Sì, usando le scorciatoie OneLake in Fabric

Puoi usarli OPENROWSET(BULK) per leggere i dati direttamente dai file memorizzati nel OneLake in Microsoft Fabric, in particolare dalla cartella Files di una casa Fabric Lakehouse. In questo modo si elimina la necessità di account di staging esterni, ad esempio ADLS Gen2 o Archiviazione BLOB, e consente l'inserimento nativo dell'area di lavoro gestito dall'area di lavoro usando le autorizzazioni di Infrastruttura. Questa funzionalità supporta:

  • Lettura da Files cartelle in Lakehouses
  • Carichi da area di lavoro a magazzino all'interno dello stesso tenant
  • Imposizione dell'identità nativa con Microsoft Entra ID

Vedere le limitazioni applicabili sia a che COPY INTOa OPENROWSET(BULK) .

DATA_SOURCE

DATA_SOURCE definisce il percorso radice del percorso del file di dati. Consente di usare percorsi relativi nel percorso BULK. L'origine dati viene creata con CREATE EXTERNAL DATA SOURCE.

Oltre al percorso radice, può definire credenziali personalizzate che possono essere usate per accedere ai file in tale percorso.

Per esempio:

CREATE EXTERNAL DATA SOURCE root
WITH (LOCATION = '<scheme:>//pandemicdatalake.blob.core.windows.net/public')
GO
SELECT *
FROM OPENROWSET(
    BULK '/curated/covid-19/bing_covid-19_data/latest/*.parquet',
    DATA_SOURCE = 'root'
);

Opzioni di formato file

CODEPAGE

Specifica la pagina di codice dei dati nel file di dati. CODEPAGE è rilevante solo se i dati contengono colonne char, varchar o text con valori di carattere superiori a 127 o minori di 32. I valori validi sono 'ACP', 'OEM', 'RAW' o 'code_page':

Valore CODEPAGE Description
ACP Converte le colonne di tipo char, varchar o text dalla tabella codici ANSI/Microsoft Windows (ISO 1252) alla tabella codici di SQL Server.
OEM (impostazione predefinita) Converte le colonne di tipo di dati char, varchar o text dalla tabella codici OEM di sistema alla tabella codici di SQL Server.
RAW Non vengono eseguite conversioni tra tabelle codici. Si tratta dell'opzione più rapida.
code_page Indica la tabella codici di origine in cui vengono codificati i dati di tipo carattere del file di dati, ad esempio 850.

Important

Le versioni precedenti a SQL Server 2016 (13.x) non supportano la tabella codici 65001 (codifica UTF-8). CODEPAGE non è un'opzione supportata in Linux.

Note

È consigliabile specificare un nome di regole di confronto per ogni colonna in un file di formato tranne quando si vuole assegnare all'opzione 65001 la priorità sulla specifica delle regole di confronto o della tabella codici.

DATAFILETYPE

Specifica che OPENROWSET(BULK) deve leggere il contenuto del file a byte singolo (ASCII, UTF8) o multi byte (UTF16). I valori validi sono char e widechar:

Valore DATAFILETYPE Rappresentazione di tutti i dati
char (impostazione predefinita) Formato carattere.

Per altre informazioni, vedere Usare il formato carattere per importare o esportare dati.
widechar Caratteri Unicode.

Per altre informazioni, vedere Usare il formato carattere Unicode per importare o esportare dati.

FORMATO

Specifica il formato del file a cui si fa riferimento, ad esempio:

SELECT *
FROM OPENROWSET(BULK N'<data-file-path>',
                FORMAT='CSV') AS cars;

I valori validi sono 'CSV' (file di valori delimitati da virgole conformi allo standard RFC 4180 ), 'PARQUET', 'DELTA' (versione 1.0) e 'JSONL', a seconda della versione:

Versione CSV PARQUET DELTA JSONL
SQL Server 2017 (14.x), SQL Server 2019 (15.x) Yes NO NO NO
SQL Server 2022 (16.x) e versioni successive Yes Yes Yes NO
Database SQL di Microsoft Azure Yes Yes Yes NO
Istanza SQL gestita di Azure Yes Yes Yes NO
Serverless SQL pool in Azure Synapse Analytics Yes Yes Yes NO
Endpoint di analisi DI Microsoft Fabric Warehouse e SQL Yes Yes NO Yes
Database SQL su Microsoft Fabric Yes Yes NO NO

Important

La OPENROWSET funzione può leggere solo il formato JSON delimitato da newline . Il carattere di nuova riga deve essere usato come separatore tra documenti JSON e non può essere inserito al centro di un documento JSON.

Non FORMAT è necessario specificare l'opzione se l'estensione del file nel percorso termina con .csv, .tsv.parquet.parq.jsonl, .ldjson, o ..ndjson Ad esempio, la OPENROWSET(BULK) funzione sa che il formato è parquet basato sull'estensione nell'esempio seguente:

SELECT *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
);

Se il percorso del file non termina con una di queste estensioni, è necessario specificare , FORMATad esempio:

SELECT TOP 10 *
FROM OPENROWSET(
      BULK 'abfss://nyctlc@azureopendatastorage.blob.core.windows.net/yellow/**',
      FORMAT='PARQUET'
)

FORMATFILE

Specifica il percorso completo di un file di formato. SQL Server supporta due tipi di file di formato, ovvero XML e non XML.

SELECT TOP 10 *
FROM OPENROWSET(
      BULK 'D:\XChange\test-csv.csv',
      FORMATFILE= 'D:\XChange\test-format-file.xml'
)

Un file di formato è necessario per definire i tipi di colonna nel set di risultati. L'unica eccezione è quando SINGLE_CLOB, SINGLE_BLOBo SINGLE_NCLOB è specificato. In tal caso, il file di formato non è obbligatorio.

Per informazioni sui file di formato, vedere Usare un file di formato per l'importazione bulk di dati (SQL Server).For information about format files, see Use a format file to bulk import data (SQL Server).

A partire da SQL Server 2017 (14.x), il format_file_path può trovarsi in Archiviazione BLOB di Azure. Per esempi, vedere Esempi di accesso in blocco ai dati in Archiviazione BLOB di Azure.

FORMATFILE_DATA_SOURCE

FORMATFILE_DATA_SOURCE definisce il percorso radice del percorso del file di formato. Consente di usare percorsi relativi nell'opzione FORMATFILE.

CREATE EXTERNAL DATA SOURCE root
WITH (LOCATION = '//pandemicdatalake/public/curated')
GO
SELECT *
FROM OPENROWSET(
    BULK '//pandemicdatalake/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
    FORMATFILE = 'covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
    FORMATFILE_DATA_SOURCE = 'root'
);

L'origine dati del file di formato viene creata con CREATE EXTERNAL DATA SOURCE. Oltre al percorso radice, può definire credenziali personalizzate che possono essere usate per accedere ai file in tale percorso.

Opzioni testo/CSV

ROWTERMINATOR

Specifica il carattere di terminazione di riga da usare per i file di dati char e widechar , ad esempio:

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ROWTERMINATOR = '\n'
);

Il carattere di terminazione della riga predefinito è \r\n (carattere di nuova riga). Per altre informazioni, vedere Specificare caratteri di terminazione dei campi e delle righe.

FIELDTERMINATOR

Specifica il carattere di terminazione del campo da usare per i file di dati char e widechar , ad esempio:

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    FIELDTERMINATOR = '\t'
);

Il carattere di terminazione del campo predefinito è , (virgola). Per altre informazioni, vedere Specificare caratteri di terminazione dei campi e delle righe. Ad esempio, per leggere dati delimitati da tabulazioni da un file:

FIELDQUOTE = 'field_quote'

A partire da SQL Server 2017 (14.x), questo argomento specifica un carattere usato come carattere virgolette nel file CSV, come nell'esempio di New York seguente:

Empire State Building,40.748817,-73.985428,"20 W 34th St, New York, NY 10118","\icons\sol.png"
Statue of Liberty,40.689247,-74.044502,"Liberty Island, New York, NY 10004","\icons\sol.png"

È possibile specificare un solo carattere come valore per questa opzione. Se non specificato, il carattere virgolette (") viene usato come carattere di virgolette come definito nello standard RFC 4180 . Il FIELDTERMINATOR carattere (ad esempio, una virgola) può essere inserito all'interno delle virgolette di campo e verrà considerato come un carattere normale nella cella di cui è stato eseguito il wrapping con i FIELDQUOTE caratteri.

Ad esempio, per leggere il set di dati CSV di esempio di New York precedente, usare FIELDQUOTE = '"'. I valori del campo dell'indirizzo verranno conservati come valore singolo, non suddivisi in più valori in base alle virgole all'interno dei " caratteri (virgolette).

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    FIELDQUOTE = '"'
);

PARSER_VERSION = 'parser_version'

Si applica a: Solo Fabric Data Warehouse

Specifica la versione del parser da usare per la lettura dei file. Le versioni del parser attualmente supportate CSV sono 1.0 e 2.0:

  • PARSER_VERSION = '1,0'
  • PARSER_VERSION = '2.0'
SELECT TOP 10 *
FROM OPENROWSET(
      BULK 'abfss://nyctlc@azureopendatastorage.blob.core.windows.net/yellow/**',
      FORMAT='CSV',
      PARSER_VERSION = '2.0'
)

La versione 1.0 del parser CSV è l'impostazione predefinita ed è completa di tutte le funzionalità, La versione 2.0 è progettata per le prestazioni e non supporta tutte le opzioni e le codifiche.

Specifiche del parser CSV versione 1.0:

  • Le opzioni seguenti non sono supportate: HEADER_ROW.
  • I caratteri di terminazione predefiniti sono \r\ne \n\r.
  • Se si specifica \n (nuova riga) come carattere di terminazione della riga, viene automaticamente preceduto da un \r carattere (ritorno a capo), che genera un terminatore di riga di \r\n.

Specifiche del parser CSV versione 2.0:

  • Non sono supportati tutti i tipi di dati.
  • La lunghezza massima della colonna di caratteri è 8000.
  • Il limite massimo delle dimensioni di riga è 8 MB.
  • Le opzioni seguenti non sono supportate: DATA_COMPRESSION.
  • La stringa vuota racchiusa tra virgolette ("") viene interpretata come stringa vuota.
  • L'opzione DATEFORMAT SET non viene rispettata.
  • Formato supportato per il tipo di dati date : YYYY-MM-DD
  • Formato supportato per il tipo di dati time : HH:MM:SS[.fractional seconds]
  • Formato supportato per il tipo di dati datetime2 : YYYY-MM-DD HH:MM:SS[.fractional seconds]
  • I caratteri di terminazione predefiniti sono \r\n e \n.

ESCAPE_CHAR = 'char'

Specifica il carattere nel file utilizzato per eseguire l'escape e tutti i valori delimitatori nel file, ad esempio:

Place,Address,Icon
Empire State Building,20 W 34th St\, New York\, NY 10118,\\icons\\sol.png
Statue of Liberty,Liberty Island\, New York\, NY 10004,\\icons\\sol.png

Se seguito da un valore diverso da se stesso o da uno qualsiasi dei valori dei delimitatori, il carattere di escape viene eliminato durante la lettura del valore.

Il ESCAPECHAR parametro viene applicato indipendentemente dal fatto che FIELDQUOTE sia o non sia abilitato. Non verrà usato per l'escape del carattere virgolette singole. Il carattere di virgolette deve essere impostato come escape con un altro carattere di virgolette. Il carattere di virgolette può essere visualizzato all'interno del valore della colonna solo se il valore è incapsulato con caratteri tra virgolette.

Nell'esempio seguente, la virgola (,) e la barra rovesciata (\) vengono precedute da un carattere di escape e rappresentate come \, e \\:

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ESCAPECHAR = '\'
);

HEADER_ROW = { TRUE | FALSO }

Specifica se un file CSV contiene una riga di intestazione che non deve essere restituita con altre righe di dati. Un esempio di file CSV con un'intestazione è illustrato nell'esempio seguente:

Place,Latitude,Longitude,Address,Area,State,Zipcode
Empire State Building,40.748817,-73.985428,20 W 34th St,New York,NY,10118
Statue of Liberty,40.689247,-74.044502,Liberty Island,New York,NY,10004

Il valore predefinito è FALSE. Supportato in PARSER_VERSION='2.0' Fabric Data Warehouse. Se TRUE, i nomi delle colonne verranno letti dalla prima riga in base all'argomento FIRSTROW . Se TRUE e lo schema viene specificato usando WITH, l'associazione dei nomi di colonna verrà eseguita in base al nome della colonna, non alle posizioni ordinali.

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    HEADER_ROW = TRUE
);

Opzioni di gestione degli errori

ERRORFILE = 'file_name'

Specifica il file usato per raccogliere le righe che contengono errori di formattazione e non possono essere convertite in un set di righe OLE DB. Tali righe vengono copiate nel file degli errori dal file di dati così come sono.

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ERRORFILE = '<error-file-path>'
);

Il file di errori viene creato all'inizio dell'esecuzione del comando. Se il file esiste già, viene generato un errore. Viene inoltre creato un file di controllo con estensione ERROR.txt. Questo file contiene un riferimento a ogni riga nel file degli errori e fornisce informazioni di diagnostica. Dopo aver corretto gli errori, è possibile caricare i dati.

A partire da SQL Server 2017 (14.x), può error_file_path essere in Archiviazione BLOB di Azure.

ERRORFILE_DATA_SOURCE

A partire da SQL Server 2017 (14.x), questo argomento è un'origine dati esterna denominata che punta al percorso del file di errore che conterrà errori rilevati durante l'importazione.

CREATE EXTERNAL DATA SOURCE root
WITH (LOCATION = '<root-error-file-path>')
GO
SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ERRORFILE = '<relative-error-file-path>',
    ERRORFILE_DATA_SOURCE = 'root'
);

Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE (Transact-SQL).

MAXERRORS = maximum_errors

Specifica il numero massimo di errori di sintassi o righe non conformi, come definito nel file di formato, che può verificarsi prima OPENROWSET di generare un'eccezione. Finché MAXERRORS non viene raggiunto, OPENROWSET ignora ogni riga non valida, non la carica e conta la riga non valida come un errore.

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    MAXERRORS = 0
);

Il valore predefinito per maximum_errors è 10.

Note

MAX_ERRORS non si applica ai CHECK vincoli o alla conversione di tipi di dati money e Bigint .

Opzioni di elaborazione dati

PRIMA FILA = first_row

Specifica il numero della prima riga da caricare. Il valore predefinito è 1. Questo valore indica la prima riga nel file di dati specificato. I numeri di riga sono determinati dal conteggio dei caratteri di terminazione. FIRSTROW è basato su 1.

ULTIMA FILA = last_row

Specifica il numero dell'ultima riga da caricare. Il valore predefinito è 0. Questo valore indica l'ultima riga nel file di dati specificato.

ROWS_PER_BATCH = rows_per_batch

Specifica il numero approssimativo di righe di dati nel file di dati. Questo valore è una stima e deve essere un'approssimazione (entro un ordine di grandezza) del numero effettivo di righe. Per impostazione predefinita, ROWS_PER_BATCH viene stimata in base alle caratteristiche dei file (numero di file, dimensioni dei file, dimensioni dei tipi di dati restituiti). Specificare ROWS_PER_BATCH = 0 equivale a omettere ROWS_PER_BATCH. Per esempio:

SELECT TOP 10 *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ROWS_PER_BATCH = 100000
);

ORDER ( { colonna [ ASC | DESC ] } [ ,... n ] [ UNICO ] )

Hint facoltativo che specifica il modo in cui vengono ordinati i dati nel file di dati. Per impostazione predefinita, per l'operazione bulk si presume che il file di dati non sia ordinato. Le prestazioni possono migliorare se Query Optimizer può sfruttare l'ordine per generare un piano di query più efficiente. L'elenco seguente fornisce esempi per quando si specifica un ordinamento può essere utile:

  • Inserimento di righe in una tabella con un indice cluster, in cui i dati del set di righe sono ordinati in base alla chiave dell'indice cluster.
  • Unione del set di righe con un'altra tabella, in cui le colonne di ordinamento e di join corrispondono.
  • Aggregazione dei dati del set di righe tramite le colonne dell'ordinamento.
  • Utilizzo del set di righe come tabella di origine nella FROM clausola di una query, in cui le colonne di ordinamento e join corrispondono.

UNIQUE

Specifica che il file di dati non contiene voci duplicate.

Se le righe effettive nel file di dati non vengono ordinate in base all'ordine specificato o se l'hint UNIQUE è specificato e le chiavi duplicate sono presenti, viene restituito un errore.

Quando si utilizzano gli alias di colonna, sono necessari ORDER alias di colonna. L'elenco di alias di colonna deve fare riferimento alla tabella derivata a cui si accede dalla BULK clausola . I nomi di colonna specificati nella ORDER clausola fanno riferimento a questo elenco di alias di colonna. Non è possibile specificare tipi valore di grandi dimensioni (varchar(max), nvarchar(max), varbinary(max)e xml) e tipi loB (large object) (text, ntext e image).

Opzioni contenuto

SINGLE_BLOB

Restituisce il contenuto di data_file come set di righe a riga singola a colonna singola di tipo varbinary(max).

Important

È consigliabile importare dati XML solo usando l'opzione SINGLE_BLOB , anziché SINGLE_CLOB e SINGLE_NCLOB, perché supporta solo SINGLE_BLOB tutte le conversioni di codifica di Windows.

SINGLE_CLOB

Leggendo data_file come ASCII, restituisce il contenuto come set di righe a riga singola e a colonna singola di tipo varchar(max), usando le regole di confronto del database corrente.

SINGLE_NCLOB

Leggendo data_file come Unicode, restituisce il contenuto come set di righe a riga singola a colonna singola di tipo nvarchar(max), usando le regole di confronto del database corrente.

SELECT * FROM OPENROWSET(
    BULK N'C:\Text1.txt',
    SINGLE_NCLOB
) AS Document;

CON Schema

Lo schema WITH specifica le colonne che definiscono il set di risultati della funzione OPENROWSET. Include definizioni di colonna per ogni colonna che verrà restituita di conseguenza e delinea le regole di mapping che associano le colonne di file sottostanti alle colonne del set di risultati.

Nell'esempio seguente:

  • La country_region colonna ha il tipo varchar(50) e fa riferimento alla colonna sottostante con lo stesso nome
  • La date colonna fa riferimento a una colonna CSV/Parquet o a una proprietà JSONL con un nome fisico diverso
  • La cases colonna fa riferimento alla terza colonna nel file
  • La fatal_cases colonna fa riferimento a una proprietà Parquet annidata o a un oggetto secondario JSONL
SELECT *
FROM OPENROWSET(<...>) 
WITH (
        country_region varchar(50), --> country_region column has varchar(50) type and referencing the underlying column with the same name
        [date] DATE '$.updated',   --> date is referencing a CSV/Parquet column or JSONL property with a different physical name
        cases INT 3,             --> cases is referencing third column in the file
        fatal_cases INT '$.statistics.deaths'  --> fatal_cases is referencing a nested Parquet property or JSONL sub-object
     );

<column_name>

Nome della colonna che verrà restituita nel set di righe dei risultati. I dati per questa colonna vengono letti dalla colonna di file sottostante con lo stesso nome, a meno che non venga sottoposto a override da <column_path> o <column_ordinal>. Il nome della colonna deve seguire le regole per gli identificatori dei nomi di colonna.

<column_type>

Tipo T-SQL della colonna nel set di risultati. I valori del file sottostante vengono convertiti in questo tipo quando OPENROWSET restituisce i risultati. Per altre informazioni, vedere Tipi di dati in Fabric Warehouse.

<column_path>

Percorso delimitato da punti (ad esempio $.description.___location.lat) usato per fare riferimento a campi annidati in tipi complessi come Parquet.

<column_ordinal>

Numero che rappresenta l'indice fisico della colonna di cui verrà eseguito il mapping alla colonna nella clausola WITH.

Permissions

OPENROWSET con origini dati esterne, richiede le autorizzazioni seguenti:

  • ADMINISTER DATABASE BULK OPERATIONS oppure
  • ADMINISTER BULK OPERATIONS

L'esempio T-SQL seguente concede ADMINISTER DATABASE BULK OPERATIONS a un'entità di sicurezza.

GRANT ADMINISTER DATABASE BULK OPERATIONS TO [<principal_name>];

Se l'account di archiviazione di destinazione è privato, l'entità deve avere anche il ruolo lettore dati BLOB di archiviazione (o superiore) assegnato a livello di contenitore o account di archiviazione.

Remarks

  • Una clausola FROM usata con SELECT può chiamare OPENROWSET(BULK...) anziché un nome di tabella. In questo modo, sono disponibili tutte le funzionalità di SELECT.

  • OPENROWSET con l'opzione BULK richiede un nome di correlazione, noto anche come alias o variabile di intervallo, nella clausola FROM. Errore durante l'aggiunta dei AS <table_alias> risultati nell'errore Msg 491: "È necessario specificare un nome di correlazione per il set di righe bulk nella clausola from".

  • È possibile specificare alias di colonne. Se non viene specificato un elenco di alias di colonna, il file di formato deve avere nomi di colonna. Se si specificano gli alias di colonna, i nomi di colonna nel file di formato vengono sostituiti, ad esempio:

    • FROM OPENROWSET(BULK...) AS table_alias
    • FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)
  • Un'istruzione SELECT...FROM OPENROWSET(BULK...) consente di eseguire query direttamente sui dati in un file, senza importare i dati in una tabella.

  • Un'istruzione SELECT...FROM OPENROWSET(BULK...) può elencare alias di colonna bulk usando un file di formato per specificare i nomi di colonna e anche i tipi di dati.

  • L'uso OPENROWSET(BULK...) di come tabella di origine in un'istruzione INSERT o MERGE importa i dati da un file di dati in una tabella. Per altre informazioni, vedere Usare BULK INSERT o OPENROWSET(BULK...) per importare dati in SQL Server.
  • Quando l'opzione OPENROWSET BULK viene usata con un'istruzione INSERT , la BULK clausola supporta hint di tabella. Oltre agli hint di tabella normali, ad esempio TABLOCK, la clausola BULK può accettare gli hint di tabella specializzati seguenti: IGNORE_CONSTRAINTS (ignora solo i vincoli CHECK e FOREIGN KEY), IGNORE_TRIGGERS, KEEPDEFAULTS e KEEPIDENTITY. Per ulteriori informazioni, vedere Hint di tabella (Transact-SQL).
  • Per informazioni su come usare le istruzioni INSERT...SELECT * FROM OPENROWSET(BULK...), vedere Importazione ed esportazione bulk di dati (SQL Server). Per informazioni sui casi in cui le operazioni di inserimento di righe eseguite durante l'importazione in blocco vengono registrate nel log delle transazioni, vedere Prerequisiti per la registrazione minima nell'importazione in blocco.
  • Se usato per importare dati con il modello di recupero con registrazione completa, OPENROWSET (BULK ...) non ottimizza la registrazione.

Note

Quando si usa OPENROWSET, è importante comprendere come SQL Server gestisce la rappresentazione. Per informazioni sulle considerazioni sulla sicurezza, vedere Usare BULK INSERT o OPENROWSET(BULK...) per importare dati in SQL Server.

In Microsoft Fabric Data Warehouse, le funzionalità supportate sono riassunte nella tabella:

Feature Supported Non disponibile
Formati di file Parquet, CSV, JSONL Delta, Azure Cosmos DB, JSON, database relazionali
Authentication Passthrough EntraID/SPN, archiviazione pubblica SAS/SAK, SPN, Accesso gestito
Storage Azure Blob Storage, Azure Data Lake Storage, OneLake in Microsoft Fabric
Options Solo URI completo/assoluto in OPENROWSET Percorso URI relativo in OPENROWSET, DATA_SOURCE
Partitioning È possibile usare la funzione filepath() in una query.

Importazione bulk di dati SQLCHAR, SQLNCHAR o SQLBINARY

OPENROWSET(BULK...) presuppone che, se non specificato, la lunghezza massima di SQLCHAR, SQLNCHARo SQLBINARY i dati non superino 8.000 byte. Se i dati importati si trovano in un campo dati LOB contenente qualsiasi oggetto varchar(max), nvarchar(max)o varbinary(max) che supera 8.000 byte, è necessario utilizzare un file di formato XML che definisce la lunghezza massima per il campo dati. Per specificare la lunghezza massima, modificare il file di formato dichiarando l'attributo MAX_LENGTH.

Note

Un file di formato generato automaticamente non specifica la lunghezza o la lunghezza massima per un campo LOB. Tuttavia, è possibile modificare un file di formato e specificare la lunghezza o la lunghezza massima manualmente.

Esportazione o importazione in massa di documenti SQLXML

Per l'esportazione o l'importazione bulk di dati SQLXML, utilizzare uno dei tipi di dati seguenti nel file di formato.

Tipo di dati Effect
SQLCHAR o SQLVARYCHAR I dati vengono inviati nella tabella codici client o nella tabella codici implicita dalle regole di confronto.
SQLNCHAR o SQLNVARCHAR I dati vengono inviati in formato Unicode.
SQLBINARY o SQLVARYBIN I dati vengono inviati senza conversione.

Funzioni per i metadati dei file

A volte, potresti aver bisogno di sapere quale sorgente di file o cartelle corrisponde a una riga specifica nel set di risultati.

Puoi usare funzioni filepath e filename restituire nomi di file e/o il percorso nel set di risultati. Oppure puoi usarli per filtrare i dati in base al nome del file e/o al percorso della cartella. Nelle sezioni successive troverai brevi descrizioni insieme agli esempi.

Funzione nome file

Questa funzione restituisce il nome del file da cui proviene la riga.

Il tipo di dato di ritorno è nvarchar(1024). Per prestazioni ottimali, si convola sempre il risultato della funzione nome file al tipo di dato appropriato. Se usi il tipo di dato del carattere, assicurati che venga usata la lunghezza appropriata.

Il seguente esempio legge i file dati del taxi giallo di New York per gli ultimi tre mesi del 2017 e restituisce il numero di corse per file. La OPENROWSET parte della query specifica quali file verranno letti.

SELECT
    nyc.filename() AS [filename]
    ,COUNT_BIG(*) AS [rows]
FROM  
    OPENROWSET(
        BULK 'parquet/taxi/year=2017/month=9/*.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) nyc
GROUP BY nyc.filename();

Il seguente esempio mostra come filename() può essere usato nella WHERE clausola per filtrare i file da leggere. Accede all'intera cartella nella OPENROWSET parte della query e filtra i file nella WHERE clausola.

I risultati saranno gli stessi dell'esempio precedente.

SELECT
    r.filename() AS [filename]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
    BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        FIRSTROW = 2) 
        WITH (C1 varchar(200) ) AS [r]
WHERE
    r.filename() IN ('yellow_tripdata_2017-10.csv', 'yellow_tripdata_2017-11.csv', 'yellow_tripdata_2017-12.csv')
GROUP BY
    r.filename()
ORDER BY
    [filename];

Funzione del percorso file

Questa funzione restituisce un percorso completo o una parte del cammino:

  • Quando chiamato senza parametro, restituisce il percorso completo del file da cui una riga proviene da lui.
  • Quando chiamato con parametro, restituisce una parte del percorso che corrisponde al jolly sulla posizione specificata nel parametro. Ad esempio, il valore del parametro 1 restituirebbe una parte del percorso che corrisponde al primo jolly.

Il tipo di dato di ritorno è nvarchar(1024). Per prestazioni ottimali, invia sempre il risultato della filepath funzione al tipo di dato appropriato. Se usi il tipo di dato del carattere, assicurati che venga usata la lunghezza appropriata.

Il seguente esempio legge i file dati del taxi giallo di New York per gli ultimi tre mesi del 2017. Restituisce il numero di corse per percorso di file. La OPENROWSET parte della query specifica quali file verranno letti.

SELECT
    r.filepath() AS filepath
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'csv/taxi/yellow_tripdata_2017-1*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        FIRSTROW = 2
    )
    WITH (
        vendor_id INT
    ) AS [r]
GROUP BY
    r.filepath()
ORDER BY
    filepath;

Il seguente esempio mostra come filepath() può essere usato nella WHERE clausola per filtrare i file da leggere.

Puoi usare i jolly nella OPENROWSET parte della query e filtrare i file nella WHERE clausola. I risultati saranno gli stessi dell'esempio precedente.

SELECT
    r.filepath() AS filepath
    ,r.filepath(1) AS [year]
    ,r.filepath(2) AS [month]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'csv/taxi/yellow_tripdata_*-*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        FIRSTROW = 2
    )
WITH (
    vendor_id INT
) AS [r]
WHERE
    r.filepath(1) IN ('2017')
    AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
    r.filepath()
    ,r.filepath(1)
    ,r.filepath(2)
ORDER BY
    filepath;

Examples

In questa sezione vengono forniti esempi generali per illustrare come usare OPENROWSET BULK la sintassi.

A. Usare OPENROWSET per ESEGUIRE BULK INSERT i dati dei file in una colonna varbinary(max)

Si applica a: Solo SQL Server.

Nell'esempio seguente viene creata una tabella di piccole dimensioni a scopo dimostrativo e vengono inseriti dati di file da un file denominato Text1.txt nella C: directory radice in una colonna varbinary(max).

CREATE TABLE myTable (
    FileName NVARCHAR(60),
    FileType NVARCHAR(60),
    Document VARBINARY(MAX)
);
GO

INSERT INTO myTable (
    FileName,
    FileType,
    Document
)
SELECT 'Text1.txt' AS FileName,
    '.txt' AS FileType,
    *
FROM OPENROWSET(
    BULK N'C:\Text1.txt',
    SINGLE_BLOB
) AS Document;
GO

B. Usare il provider OPENROWSET BULK con un file di formato per recuperare righe da un file di testo

Si applica a: Solo SQL Server.

Nell'esempio seguente viene utilizzato un file di formato per recuperare le righe da un file di testo delimitato da tabulazioni, values.txt contenente i dati seguenti:

1     Data Item 1
2     Data Item 2
3     Data Item 3

Il file di formato, values.fmt, descrive le colonne in values.txt:

9.0
2
1  SQLCHAR  0  10 "\t"    1  ID           SQL_Latin1_General_Cp437_BIN
2  SQLCHAR  0  40 "\r\n"  2  Description  SQL_Latin1_General_Cp437_BIN

Questa query recupera i dati:

SELECT a.* FROM OPENROWSET(
    BULK 'C:\test\values.txt',
   FORMATFILE = 'C:\test\values.fmt'
) AS a;

C. Specificare un file di formato e una tabella codici

Si applica a: Solo SQL Server.

Nell'esempio seguente viene illustrato come usare contemporaneamente le opzioni del file di formato e della tabella codici.

INSERT INTO MyTable
SELECT a.* FROM OPENROWSET (
    BULK N'D:\data.csv',
    FORMATFILE = 'D:\format_no_collation.txt',
    CODEPAGE = '65001'
) AS a;

D. Accedere ai dati da un file CSV con un file di formato

Si applica a: SOLO SQL Server 2017 (14.x) e versioni successive.

SELECT * FROM OPENROWSET(
    BULK N'D:\XChange\test-csv.csv',
    FORMATFILE = N'D:\XChange\test-csv.fmt',
    FIRSTROW = 2,
    FORMAT = 'CSV'
) AS cars;

E. Accedere ai dati da un file CSV senza un file di formato

Si applica a: Solo SQL Server.

SELECT * FROM OPENROWSET(
   BULK 'C:\Program Files\Microsoft SQL Server\MSSQL14\MSSQL\DATA\inv-2017-01-19.csv',
   SINGLE_CLOB
) AS DATA;
SELECT *
FROM OPENROWSET('MSDASQL',
    'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
    'SELECT * FROM E:\Tlog\TerritoryData.csv'
);

Important

Il driver ODBC deve essere a 64 bit. Aprire la scheda Driver dell'applicazione Connetti a un'origine dati ODBC (Importazione/Esportazione guidata SQL Server) in Windows per verificarlo. È disponibile a 32 bit Microsoft Text Driver (*.txt, *.csv) che non funzionerà con una versione a 64 bit di sqlservr.exe.

F. Accedere ai dati da un file archiviato in Archiviazione BLOB di Azure

Si applica a: SOLO SQL Server 2017 (14.x) e versioni successive.

In SQL Server 2017 (14.x) e versioni successive, nell'esempio seguente viene usata un'origine dati esterna che punta a un contenitore in un account di archiviazione di Azure e a credenziali con ambito database create per una firma di accesso condiviso.

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   SINGLE_CLOB
) AS DataFile;

Per esempi completiOPENROWSET, inclusa la configurazione delle credenziali e dell'origine dati esterna, vedere Esempi di accesso in blocco ai dati in Archiviazione BLOB di Azure.

G. Importare in una tabella da un file archiviato in Archiviazione BLOB di Azure

L'esempio seguente illustra come usare il OPENROWSET comando per caricare dati da un file CSV in un percorso di archiviazione BLOB di Azure in cui è stata creata la chiave di firma di accesso condiviso. La posizione di Archiviazione BLOB di Azure è configurata come origine dati esterna. Questa operazione richiede credenziali con ambito database che usano una firma di accesso condiviso crittografata con una chiave master nel database utente.

-- Optional: a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

-- Optional: a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';

-- Make sure that you don't have a leading ? in the SAS token, and that you
-- have at least read permission on the object that should be loaded srt=o&sp=r,
-- and that expiration period is valid (all dates are in UTC time)
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/curriculum',
    -- CREDENTIAL is not required if a blob is configured for public (anonymous) access!
    CREDENTIAL = MyAzureBlobStorageCredential
);

INSERT INTO achievements
WITH (TABLOCK) (
    id,
    description
)
SELECT * FROM OPENROWSET(
    BULK 'csv/achievements.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FORMATFILE = 'csv/achievements-c.xml',
    FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage'
) AS DataFile;

H. Usare un'identità gestita per un'origine esterna

Si applica a: Istanza gestita di SQL di Azure e database SQL di Azure

L'esempio seguente crea una credenziale usando un'identità gestita, crea un'origine esterna e quindi carica i dati da un file CSV ospitato nell'origine esterna.

Creare prima di tutto le credenziali e specificare l'archiviazione BLOB come origine esterna:

CREATE DATABASE SCOPED CREDENTIAL sampletestcred
WITH IDENTITY = 'MANAGED IDENTITY';

CREATE EXTERNAL DATA SOURCE SampleSource
WITH (
    LOCATION = 'abs://****************.blob.core.windows.net/curriculum',
    CREDENTIAL = sampletestcred
);

Caricare quindi i dati dal file CSV ospitato nell'archivio BLOB:

SELECT * FROM OPENROWSET(
    BULK 'Test - Copy.csv',
    DATA_SOURCE = 'SampleSource',
    SINGLE_CLOB
) as test;

I. Usare OPENROWSET per accedere a diversi file Parquet usando l'archiviazione oggetti compatibile con S3

Si applica a: SQL Server 2022 (16.x) e versioni successive.

L'esempio seguente usa l'accesso a diversi file Parquet da un percorso diverso, tutti archiviati nell'archivio oggetti compatibile con S3:

CREATE DATABASE SCOPED CREDENTIAL s3_dsc
WITH IDENTITY = 'S3 Access Key',
SECRET = 'contosoadmin:contosopwd';
GO

CREATE EXTERNAL DATA SOURCE s3_eds
WITH
(
    LOCATION = 's3://10.199.40.235:9000/movies',
    CREDENTIAL = s3_dsc
);
GO

SELECT * FROM OPENROWSET(
    BULK (
        '/decades/1950s/*.parquet',
        '/decades/1960s/*.parquet',
        '/decades/1970s/*.parquet'
    ),
    FORMAT = 'PARQUET',
    DATA_SOURCE = 's3_eds'
) AS data;

J. Usare OPENROWSET per accedere a diverse tabelle Delta da Azure Data Lake Gen2

Si applica a: SQL Server 2022 (16.x) e versioni successive.

In questo esempio il contenitore della tabella dati è denominato Contosoe si trova in un account di archiviazione di Azure Data Lake Gen2.

CREATE DATABASE SCOPED CREDENTIAL delta_storage_dsc
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<SAS Token>';

CREATE EXTERNAL DATA SOURCE Delta_ED
WITH (
    LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
    CREDENTIAL = delta_storage_dsc
);

SELECT *
FROM OPENROWSET(
    BULK '/Contoso',
    FORMAT = 'DELTA',
    DATA_SOURCE = 'Delta_ED'
) AS result;

K. Usare OPENROWSET per eseguire query su un set di dati pubblico-anonimo

L'esempio seguente usa il set di dati aperto disponibile pubblicamente per le corse dei taxi gialli di New York.

Creare prima l'origine dati:

CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');

Eseguire una query su tutti i file con .parquet estensione nelle cartelle che corrispondono al modello di nome:

SELECT TOP 10 *
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet'
) AS filerows;

A. Leggere un file parquet da Archiviazione BLOB di Azure

Nell'esempio seguente è possibile vedere come leggere 100 righe da un file Parquet:

SELECT TOP 100 * 
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
);

B. Leggere un file CSV personalizzato

Nell'esempio seguente è possibile vedere come leggere le righe da un file CSV con una riga di intestazione e i caratteri di terminazione specificati in modo esplicito che separano righe e campi:

SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv',
 HEADER_ROW = TRUE,
 ROW_TERMINATOR = '\n',
 FIELD_TERMINATOR = ',');

C. Specificare lo schema della colonna di file durante la lettura di un file

Nell'esempio seguente è possibile vedere come specificare in modo esplicito lo schema di riga che verrà restituito come risultato della OPENROWSET funzione:

SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet') 
WITH (
        updated DATE
        ,confirmed INT
        ,deaths INT
        ,iso2 VARCHAR(8000)
        ,iso3 VARCHAR(8000)
        );

D. Leggere set di dati partizionati

Nell'esempio seguente è possibile vedere come usare la funzione filepath() per leggere le parti dell'URI dal percorso del file corrispondente:

SELECT TOP 10 
  files.filepath(2) AS area
, files.*
FROM OPENROWSET(
BULK 'https://<storage account>.blob.core.windows.net/public/NYC_Property_Sales_Dataset/*_*.csv',
 HEADER_ROW = TRUE) 
AS files
WHERE files.filepath(1) = '2009';

E. Specificare lo schema della colonna di file durante la lettura di un file JSONL

Nell'esempio seguente è possibile vedere come specificare in modo esplicito lo schema di riga che verrà restituito come risultato della OPENROWSET funzione:

SELECT TOP 10 *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.dfs.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.jsonl') 
WITH (
        country_region varchar(50),
        date DATE '$.updated',
        cases INT '$.confirmed',
        fatal_cases INT '$.deaths'
     );

Se un nome di colonna non corrisponde al nome fisico di una colonna nelle proprietà se il file JSONL, è possibile specificare il nome fisico nel percorso JSON dopo la definizione del tipo. È possibile usare più proprietà. Ad esempio, $.___location.latitude per fare riferimento alle proprietà annidate in tipi complessi parquet o oggetti secondari JSON.

Altri esempi

A. Usa OPENROWSET per leggere un file CSV da un Fabric Lakehouse

In questo esempio, OPENROWSET verrà utilizzato per leggere un file CSV disponibile su Fabric Lakehouse, chiamato customer.csv, memorizzato sotto la Files/Contoso/ cartella. Poiché non vengono fornite credenziali Data Source e Database Scoped, il database SQL Fabric si autentica con il contesto Entra ID dell'utente.

SELECT * FROM OPENROWSET 
( BULK ' abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso/customer.csv' 
, FORMAT = 'CSV' 
, FIRST_ROW = 2 
) WITH 
(  
    CustomerKey INT,  
    GeoAreaKey INT,  
    StartDT DATETIME2,  
    EndDT DATETIME2,  
    Continent NVARCHAR(50),  
    Gender NVARCHAR(10),  
    Title NVARCHAR(10),  
    GivenName NVARCHAR(100),  
    MiddleInitial VARCHAR(2),  
    Surname NVARCHAR(100),  
    StreetAddress NVARCHAR(200),  
    City NVARCHAR(100),  
    State NVARCHAR(100),  
    StateFull NVARCHAR(100),  
    ZipCode NVARCHAR(20),  
    Country_Region NCHAR(2),  
    CountryFull NVARCHAR(100),  
    Birthday DATETIME2,  
    Age INT,  
    Occupation NVARCHAR(100),  
    Company NVARCHAR(100),  
    Vehicle NVARCHAR(100),  
    Latitude DECIMAL(10,6),  
    Longitude DECIMAL(10,6) ) AS DATA 

B. Usa OPENROWSET per leggere il file da Fabric Lakehouse e inserirlo in una nuova tabella

In questo esempio, OPENROWSET verrà prima usato per leggere dati da un file parquetstore.parquet denominato. Successivamente, INSERT i dati vengono trasformati in una nuova tabella chiamata Store. Il file parquet si trova in Fabric Lakehouse, poiché non sono forniti DATA_SOURCE e credenziali con ambito di database, il database SQL in Fabric si autentica con il contesto Entra ID dell'utente.

SELECT * 
FROM OPENROWSET 
(BULK 'abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso/store.parquet' 
, FORMAT = 'parquet' )
 AS dataset; 

-- insert into new table 
SELECT * 
INTO Store 
FROM OPENROWSET 
(BULK 'abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso/store.parquet' 
, FORMAT = 'parquet' ) 
 AS STORE; 

Altri esempi

Per altri esempi che illustrano l'uso OPENROWSET(BULK...)di , vedere gli articoli seguenti: