Connettere, eseguire query ed esportare dati con PolyBase

Si applica a: SQL Server 2016 (13.x) e versioni successive database SQL di Azure AzureSQL Managed InstanceSQL database in Microsoft Fabric

La virtualizzazione dei dati consente di eseguire query di Transact-SQL (T-SQL) su dati esterni senza caricarli nel database. Si definisce un'origine dati esterna, un formato di file facoltativo e una tabella esterna e quindi si esegue una query sulla tabella esterna con SELECT come qualsiasi altra tabella.

Questa guida consente di:

  • Comprendi quali funzionalità di PolyBase sono supportate dalla tua piattaforma SQL e versione.
  • Scegliere tra OPENROWSET, tabelle esterne e BULK INSERT per l'esecuzione di query o l'inserimento di dati.
  • Seguire i collegamenti passo passo per gli scenari comuni.
  • Esaminare le prestazioni, la risoluzione dei problemi e le procedure consigliate per i carichi di lavoro di produzione.

Supporto della piattaforma

Casi d'uso comuni

La tabella seguente descrive i possibili scenari di utilizzo.

Scenario Utilizzo
Esplorazione di file ad hoc OPENROWSET(BULK ...)
Interrogazione riutilizzabile dei file per BI o creazione di report Tabelle esterne su file
Query inter-database (SQL Server, Oracle, Teradata, MongoDB, ODBC) Connettori PolyBase con tabelle esterne
Esportazione dei risultati delle query in file CREATE EXTERNAL TABLE AS SELECT (CETAS)
Inserimento massivo nelle tabelle BULK INSERT o OPENROWSET(BULK ...) con INSERT ... SELECT
  • Per l'esplorazione ad hoc dei file, usa OPENROWSET(BULK ...) per ispezionare i file senza creare una tabella riutilizzabile.
  • Per la query di file riutilizzabili in BI o scenari di reporting, usa tabelle esterne invece dei file per mantenere uno schema e condividere i risultati tra le query.
  • Per le query cross-database, utilizzare connettori PolyBase con tabelle esterne per accedere a fonti SQL Server, Oracle, Teradata, MongoDB o ODBC.
  • Per esportare i risultati delle query nei file, si usa CREATE EXTERNAL TABLE AS SELECT (CETAS) per scrivere output Parquet o CSV al di fuori del database.
  • Per l'ingestione in massa nelle tabelle, usa BULK INSERT o OPENROWSET(BULK ...) con INSERT ... SELECT per caricare i dati dei file nelle tabelle del database.

Quali funzionalità sono disponibili dove?

La tabella seguente mostra quali funzionalità principali di PolyBase e virtualizzazione dei dati sono disponibili su ciascuna piattaforma SQL a partire da SQL Server 2019. Per la disponibilità delle funzionalità in SQL Server 2016 e SQL Server 2017 su Windows, vedi funzionalità e limitazioni di PolyBase. Usare questa tabella per determinare le operazioni che è possibile eseguire sulla piattaforma prima di usare le guide dettagliate.

Feature SQL Server 2019 SQL Server 2022 SQL Server 2025 Database SQL di Microsoft Azure Istanza SQL gestita di Azure Database SQL di Microsoft Fabric
tabelle esterne Sì Sì Sì Sì Sì Sì
OPENROWSET (BULK) Sì 1 Sì Sì Sì Sì Sì
CETAS (esportazione) No Sì Sì No Sì No
File CSV/delimitati Sì 2 Sì Sì Sì Sì Sì
File Parquet No Sì Sì Sì Sì Sì
Tabelle Delta Lake No Sì Sì No No No
Connettersi a un altro SQL Server Sì Sì Sì No No No
Connettersi al database SQL di Azure o all'istanza gestita di SQL di Azure Sì 3 Sì 3 Sì 3 No No No
Connettersi a Oracle/Teradata/MongoDB Sì Sì Sì No No No
Connettersi ad Archiviazione BLOB di Azure Sì Sì Sì Sì Sì No
Connettersi ad ADLS Gen2 Sì 5 Sì Sì Sì Sì No
Connettersi all'archiviazione compatibile con S3 No Sì Sì No No No
Connettersi a OneLake (Fabric) No No No No No Sì
Calcolo *pushdown* Sì Sì Sì No No No
Autenticazione dell'identità gestita No No Sì 4 Sì Sì No

1 SQL Server 2019 (15.x) supporta OPENROWSET(BULK...) per i percorsi di file di rete e locali. In SQL Server 2022 (16.x) e versioni successive supporta OPENROWSET(BULK...) anche la lettura dall'archiviazione cloud con FORMAT = 'PARQUET', FORMAT = DELTAe FORMAT = 'CSV'.

2 Il supporto CSV in SQL Server 2019 (15.x) richiedeva Hadoop. In SQL Server 2022 (16.x) e versioni successive il file CSV è supportato in modo nativo senza Hadoop.

3 Usa il connettore SQL Server (sqlserver://). La credenziale con ambito database è destinata all'endpoint SQL. Usa gli stessi passaggi per connetterti a un'altra istanza di SQL Server.

4 L'autenticazione con Managed Identity è supportata per la connessione a Archiviazione BLOB di Azure (ABS) e ADLS Gen2. Richiede SQL Server abilitato per Azure Arc o SQL Server in una macchina virtuale di Azure per SQL Server locale. È disponibile in modo nativo nel database SQL di Azure e nell'istanza gestita di SQL di Azure.

5 SQL Server 2019 CU11 e versioni successive supportano Azure Data Lake Storage Gen2 con il prefisso abfs o abfss. In SQL Server 2022 e versioni successive, usa il adls prefisso.

  • Le tabelle esterne sono supportate in SQL Server 2019, SQL Server 2022, SQL Server 2025, database SQL di Azure, Istanza gestita di SQL di Azure e nel database SQL di Microsoft Fabric.
  • OPENROWSET (BULK)è supportato in SQL Server 2019, SQL Server 2022, SQL Server 2025, database SQL di Azure, Istanza gestita di SQL di Azure e database SQL in Microsoft Fabric. SQL Server 2019 supporta percorsi file locali e di rete, mentre SQL Server 2022 e versioni successive supportano anche la lettura dello storage cloud con FORMAT = 'PARQUET', FORMAT = DELTA, e FORMAT = 'CSV'.
  • L'esportazione CETAS non è supportata in SQL Server 2019, database SQL di Azure o SQL Database in Microsoft Fabric. L'esportazione CETAS è supportata in SQL Server 2022, SQL Server 2025 e Istanza gestita di SQL di Azure.
  • CSV e file delimitati sono supportati in SQL Server 2019, SQL Server 2022, SQL Server 2025, database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in Microsoft Fabric. SQL Server 2019 richiede Hadoop per il supporto CSV, mentre SQL Server 2022 e versioni successive supportano CSV nativamente senza Hadoop.
  • I file Parquet non sono supportati in SQL Server 2019. I file Parquet sono supportati in SQL Server 2022, SQL Server 2025, database SQL di Azure, Istanza gestita di SQL di Azure e database SQL in Microsoft Fabric.
  • Le tabelle Delta Lake non sono supportate in SQL Server 2019, database SQL di Azure, Istanza gestita di SQL di Azure o nel database SQL in Microsoft Fabric. Le tabelle Delta Lake sono supportate in SQL Server 2022 e SQL Server 2025.
  • La connessione a un'altra istanza di SQL Server è supportata in SQL Server 2019, SQL Server 2022 e SQL Server 2025. La connessione a un'altra istanza SQL Server non è supportata da database SQL di Azure, Istanza gestita di SQL di Azure o database SQL in Microsoft Fabric.
  • La connessione ad database SQL di Azure o Istanza gestita di SQL di Azure è supportata da SQL Server 2019, SQL Server 2022 e SQL Server 2025 utilizzando il connettore SQL Server. La credenziale con ambito database mira all'endpoint database SQL di Azure o Istanza gestita di SQL di Azure, e i passaggi di configurazione sono gli stessi per la connessione a un'altra istanza SQL Server. Queste connessioni non sono supportate da database SQL di Azure, Istanza gestita di SQL di Azure o database SQL in Microsoft Fabric.
  • La connessione a Oracle, Teradata o MongoDB è supportata da SQL Server 2019, SQL Server 2022 e SQL Server 2025. Queste connessioni non sono supportate da database SQL di Azure, Istanza gestita di SQL di Azure o database SQL in Microsoft Fabric.
  • La connessione ad Archiviazione BLOB di Azure è supportata da SQL Server 2019, SQL Server 2022, SQL Server 2025, database SQL di Azure e Istanza gestita di SQL di Azure. La connessione ad Archiviazione BLOB di Azure non è supportata dal database SQL in Microsoft Fabric.
  • La connessione ad ADLS Gen2 non è supportata nelle versioni di SQL Server 2019 precedenti a CU11 né dal database SQL in Microsoft Fabric. La connessione ad ADLS Gen2 è supportata a partire da SQL Server 2019 CU11, e in SQL Server 2022, SQL Server 2025, database SQL di Azure e Istanza gestita di SQL di Azure.
  • La connessione a storage compatibile con S3 non è supportata da SQL Server 2019, database SQL di Azure, Istanza gestita di SQL di Azure o database SQL in Microsoft Fabric. La connessione allo storage compatibile con S3 è supportata da SQL Server 2022 e SQL Server 2025.
  • La connessione a OneLake è supportata dal database SQL in Microsoft Fabric. La connessione a OneLake non è supportata da SQL Server 2019, SQL Server 2022, SQL Server 2025, database SQL di Azure o Istanza gestita di SQL di Azure.
  • Il calcolo pushdown è supportato in SQL Server 2019, SQL Server 2022 e SQL Server 2025. Il calcolo pushdown non è supportato in database SQL di Azure, Istanza gestita di SQL di Azure o database SQL in Microsoft Fabric.
  • L'autenticazione Managed Identity non è supportata in SQL Server 2019 o SQL Server 2022. L'autenticazione Managed Identity è supportata in SQL Server 2025 per le connessioni a Archiviazione BLOB di Azure e ADLS Gen2, e richiede SQL Server abilitato Azure Arc o SQL Server su una macchina virtuale Azure. L'autenticazione Managed Identity è supportata anche in database SQL di Azure e Istanza gestita di SQL di Azure, ma non è supportata nel database SQL in Microsoft Fabric.

Annotazioni

A partire da SQL Server 2025 (17.x) l'esecuzione di query sui file di dati (CSV, Parquet e Delta) nell'Archiviazione BLOB di Azure, ADLS Gen2 o archiviazione compatibile con S3 è una funzionalità nativa del motore e non richiede più l'installazione o l'esecuzione di servizi PolyBase. I connettori RDBMS (SQL Server, Oracle, Teradata, MongoDB, ODBC) richiedono comunque l'installazione e l'esecuzione dei servizi PolyBase. SQL Server 2025 (17.x) aggiunge anche il supporto Linux per questi connettori, che in precedenza erano disponibili solo in Windows.

Interrogare dati esterni

Prima di scegliere uno scenario specifico, comprendere i tre modi per eseguire query sui dati esterni:

Avvicinarsi Sintassi Usare quando Autenticazione Installazione di PolyBase necessaria
Query OLE DB ad hoc OPENROWSET(provider, connection, query) Si vuole eseguire una query una tantum rapida senza oggetti persistenti oppure è necessaria l'autenticazione dell'ID Entra Di Microsoft Autenticazione SQL, autenticazione di Windows, ID Microsoft Entra (MSOLEDBSQL) No
Interrogazioni ad hoc nei file OPENROWSET(BULK ...) Si vogliono esplorare rapidamente i dati dei file o testare gli schemi prima di creare una tabella Token SAS, chiave di accesso, identità gestita, Microsoft Entra ID SQL Server 2022: Sì 1

SQL Server 2025 e versioni successive: No

database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in Fabric: integrato
Connettori dati persistenti CREATE EXTERNAL TABLE con sqlserver://, oracle://, teradata://e così via. È necessario l'accesso continuo, la governance, le statistiche e il calcolo pushdown per l'ambiente di produzione. Solo autenticazione SQL Sì

1 Per l'accesso ai file cloud in SQL Server 2022 (16.x), devi installare la funzione PolyBase, ma i connettori di storage compatibili con Archiviazione BLOB di Azure, ADLS Gen2 e S3 non dipendono dai servizi PolyBase. SQL Server 2025 (17.x) e versioni successive offrono supporto nativo per CSV, Parquet e Delta senza installare o eseguire servizi PolyBase.

  • Le query ad hoc OLE DB servono OPENROWSET(provider, connection, query) per un rapido accesso una tantum a una sorgente di dati remota senza creare oggetti persistenti. Possono utilizzare l'autenticazione SQL, autenticazione di Windows o Microsoft Entra ID con MSOLEDBSQL. Questo scenario non richiede l'installazione di PolyBase.
  • Le query ad hoc sui file servono OPENROWSET(BULK ...) a esplorare rapidamente i dati dei file o a testare uno schema prima di creare una tabella. Possono utilizzare token SAS, chiavi di accesso, Managed Identity o Microsoft Entra ID. SQL Server 2022 richiede l'installazione della funzione PolyBase per i file cloud, ma non richiede i servizi PolyBase. SQL Server 2025 e versioni successive non richiedono PolyBase per i file cloud. Le query ad hoc dei file sono integrate in database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in Fabric.
  • I connettori dati persistenti utilizzano CREATE EXTERNAL TABLE con sqlserver://, oracle://, teradata://, e posizioni simili per accesso ricorrente, governance, statistiche e calcolo pushdown nei carichi di lavoro in produzione. Richiedono autenticazione SQL e servizi PolyBase.

Guida alle decisioni

Scenario Raccomandazione
Serve l'autenticazione Microsoft Entra ID per SQL remoto, oppure vuoi evitare i servizi PolyBase. Usa OPENROWSET(MSOLEDBSQL, ...) (ad hoc, niente oggetti persistenti).
Servono tabelle persistenti, statistiche o calcoli pushdown su database remoti. Usare CREATE EXTERNAL TABLE con i connettori PolyBase (sqlserver://, oracle://, teradata://mongodb://, , odbc://). OPENROWSET Non supporta connettori.
Stai esplorando un nuovo file o testando uno schema. Usa OPENROWSET(BULK ...) (iterazione veloce, nessun oggetto persistente).
Stai importando i dati di un file in una tabella applicando trasformazioni. Utilizzare INSERT ... SELECT da OPENROWSET(BULK ...).
Serve governance o accesso condiviso per molti utenti o applicazioni. Usa CREATE EXTERNAL TABLE in modo che permessi e metadati siano centralizzati.
Stai lavorando su database SQL in Fabric. Usa OPENROWSET(BULK ...) per query ad hoc di OneLake o tabelle esterne per un accesso riutilizzabile; per l'archiviazione esterna usa i collegamenti OneLake.
  • Se hai bisogno dell'autenticazione Microsoft Entra ID per SQL remoto o vuoi evitare i servizi PolyBase, usa OPENROWSET(MSOLEDBSQL, ...) per eseguire query remote ad hoc senza oggetti persistenti.
  • Se hai bisogno di tabelle persistenti, statistiche o calcoli pushdown verso database remoti, usa CREATE EXTERNAL TABLE con connettori PolyBase come sqlserver://, oracle://, teradata://, mongodb://, e odbc://. OPENROWSET Non supporta questi connettori.
  • Se stai esplorando un nuovo file o testando uno schema, usa OPENROWSET(BULK ...) per iterazioni rapide e senza oggetti persistenti.
  • Se stai assorbendo dati di file in una tabella con trasformazioni, usa INSERT ... SELECT da OPENROWSET(BULK ...).
  • Se hai bisogno di governance o di accesso condiviso per molti utenti o applicazioni, usa CREATE EXTERNAL TABLE così che autorizzazioni e metadati siano centralizzati.
  • Se lavori con un database SQL in Fabric, usa OPENROWSET(BULK ...) per query ad hoc su OneLake o tabelle esterne per un accesso riutilizzabile e usa le scorciatoie di OneLake per l'archiviazione esterna.

Scegliere lo scenario

Dopo aver compreso i tre approcci, usare una delle guide seguenti per implementare il caso d'uso specifico.

File di query (Parquet, CSV o Delta)

Se i dati si trovano in file Parquet, CSV o Delta in Archiviazione BLOB di Azure, ADLS Gen2, archiviazione compatibile con S3 o OneLake, seguire una delle guide seguenti:

Scenario Guida consigliata Platforms
Interrogazione ad hoc veloce su un file Parquet o CSV Utilizzare il OPENROWSET. Nessuna tabella esterna necessaria SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Fabric
Query ripetute su file Parquet con uno schema persistente Creare una tabella esterna su Parquet SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Fabric
Interrogare file CSV utilizzando una tabella esterna Creare una tabella esterna con un formato di file per il testo delimitato SQL Server 2019 (15.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Fabric
Eseguire query sulle tabelle Delta Lake Creare una tabella esterna con FILE_FORMAT = DeltaLakeFileFormat SQL Server 2022 (16.x) e versioni successive
Esportare i risultati delle query in file Parquet o CSV (CETAS) Utilizzare CREATE EXTERNAL TABLE AS SELECT. SQL Server 2022 (16.x) e versioni successive, Istanza gestita di SQL di Azure
  • Per una veloce query ad hoc su un file Parquet o CSV, usa OPENROWSET. Questo metodo non richiede una tabella esterna. SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in Fabric supportano questo schema.
  • Per eseguire query ripetute su file Parquet con uno schema persistente, usa una tabella esterna su Parquet. SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in Fabric supportano questo schema.
  • Per eseguire una query su file CSV, usa una tabella esterna con un formato di file per testo delimitato. SQL Server 2019 (15.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in Fabric supportano questo schema.
  • Per eseguire una query su tabelle Delta Lake, usa una tabella esterna con FILE_FORMAT = DeltaLakeFileFormat. SQL Server 2022 (16.x) e versioni successive supportano questo schema.
  • Per esportare i risultati delle query in file Parquet o CSV, usa CREATE EXTERNAL TABLE AS SELECT. SQL Server 2022 (16.x) e versioni successive e Istanza gestita di SQL di Azure supportano questo schema.

È anche possibile seguire una di queste esercitazioni dettagliate:

Tutoriale Descrizione
Introduzione con PolyBase in SQL Server 2022 Copre OPENROWSET con Parquet e CSV, tabelle esterne e navigazione tra cartelle.
Virtualizzare un file Parquet in una risorsa di archiviazione di oggetti compatibile con S3 con PolyBase Esercitazione per SQL Server 2022 (16.x) e versioni successive.
Virtualizzare il file CSV con PolyBase Esercitazione per SQL Server 2022 (16.x) e versioni successive.
Virtualizzare la tabella delta con PolyBase Esercitazione per SQL Server 2022 (16.x) e versioni successive.
Virtualizzazione dei dati con il database SQL di Azure (anteprima) Guida al database SQL di Azure per Parquet e CSV.
Virtualizzazione dei dati con Istanza gestita di SQL di Azure Guida all'Istanza SQL gestita di Azure per Parquet, CSV e CETAS.
Virtualizzazione dei dati in database SQL in Fabric Guida ai file OneLake per il database SQL in Fabric.

Connettersi a un'altra istanza di SQL Server, al database SQL di Azure o a Istanza Gestita di SQL

In SQL Server 2019 (15.x) e versioni successive PolyBase può eseguire query sulle tabelle in un'altra istanza di SQL Server, nel database SQL di Azure o in Istanza gestita di SQL di Azure, senza usare server collegati.

Importante

Il sqlserver:// connettore non è supportato nel database SQL in Fabric. I connettori RDBMS PolyBase usano l'autenticazione SQL tramite CREATE DATABASE SCOPED CREDENTIAL e non supportano Microsoft Entra ID, identità gestita o autenticazione del principale del servizio. Poiché il database SQL in Fabric richiede l'autenticazione Di Microsoft Entra, non è possibile connettersi tramite PolyBase.

Passo Cosa fare
1. Installare PolyBase Installare PolyBase in Windows o installare PolyBase in Linux
2. Creare una credenziale CREATE DATABASE SCOPED CREDENTIAL con il login di destinazione
3. Creare una fonte dati esterna CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')
4. Creare una tabella esterna CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')
5. Interrogazione SELECT * FROM <external_table>
    1. Installa PolyBase su Windows o Linux usando Install PolyBase su Windows o installa PolyBase su Linux prima di configurare l'accesso ai dati SQL esterni.
    1. Creare una credenziale con ambito database con il login di destinazione usando CREATE DATABASE SCOPED CREDENTIAL in modo che il motore possa autenticarsi al server remoto.
    1. Crea una fonte di dati esterna per il SQL Server remoto utilizzando CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>').
    1. Crea una tabella esterna usando CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>') per rappresentare la tabella remota.
    1. Interroga la tabella esterna usando SELECT * FROM <external_table>.

Suggerimento

Il connettore SQL Server (sqlserver://) funziona anche per il database SQL di Azure e per Istanza gestita di SQL di Azure. Usa gli stessi passaggi e imposta LOCATION come endpoint database SQL di Azure o Istanza gestita di SQL di Azure (ad esempio, sqlserver://myserver.database.windows.net).

Per una guida dettagliata, vedere Configurare PolyBase per accedere ai dati esterni in SQL Server.

Connettersi a Oracle, Teradata o MongoDB

SQL Server 2019 (15.x) e versioni successive possono eseguire query su Oracle, Teradata, MongoDB e Cosmos DB tramite connettori ODBC PolyBase.

L'origine dei dati Guida Requisiti
Oracle Configurare PolyBase per l'accesso a dati esterni in Oracle SQL Server 2019 (15.x) e versioni successive; driver client di Oracle
Teradata Configurare PolyBase per l'accesso a dati esterni in Teradata SQL Server 2019 (15.x) e versioni successive, driver ODBC Teradata
MongoDB/Cosmos DB Configurare PolyBase per l'accesso a dati esterni in MongoDB SQL Server 2019 (15.x) e versioni successive, driver ODBC MongoDB
Qualsiasi origine ODBC Configurare PolyBase per l'accesso a dati esterni con i tipi generici ODBC SQL Server 2019 (15.x) e versioni successive (Windows)

(Linux a partire da SQL Server 2025 (17.x))

Connettersi ad Archiviazione BLOB di Azure o Azure Data Lake Storage Gen2 (ADLS Gen2)

Piattaforma SQL Opzioni di autenticazione Guida
SQL Server 2022 (16.x) e versioni successive Token SAS, chiave di accesso, identità gestita (a partire da SQL Server 2025 (17.x)) Configurare PolyBase per accedere ai dati esterni in Archiviazione BLOB di Azure
SQL Server 2019 (15.x) Chiave di accesso (tramite connettore Hadoop) Configurare PolyBase per accedere ai dati esterni in Archiviazione BLOB di Azure
Database SQL di Microsoft Azure Token di Accesso Condiviso, identità gestita, passaggio di Microsoft Entra Virtualizzazione dei dati con il database SQL di Azure (anteprima)
Istanza SQL gestita di Azure token SAS, identità gestita Virtualizzazione dei dati con Istanza gestita di SQL di Azure

In SQL Server 2022 (16.x), i prefissi URI sono stati modificati. Quando si esegue la migrazione da SQL Server 2019 (15.x) o versioni precedenti:

  • Archiviazione BLOB di Azure: Cambia wasb[s]:// in abs://
  • ADLS Gen2: Passare abfs[s]:// a adls://

Per altre informazioni, vedere Configurare PolyBase per accedere ai dati esterni in Archiviazione BLOB di Azure.

Connettersi all'archiviazione di oggetti compatibile con S3

SQL Server 2022 (16.x) e versioni successive supportano l'archiviazione compatibile con S3, ad esempio Amazon S3, MinIO e Ceph.

Per altre informazioni, vedere Configurare PolyBase per accedere ai dati esterni nell'archiviazione oggetti compatibile con S3.

Esportare i dati con CREATE EXTERNAL TABLE AS SELECT (CETAS)

CETAS esporta i risultati delle query in file esterni (Parquet o CSV) in Archiviazione BLOB di Azure, ADLS Gen2 o archiviazione compatibile con S3.

Piattaforma SQL Supportato Formati di esportazione Note
SQL Server 2022 (16.x) e versioni successive. L'esportazione in ADLS Gen2 con CETAS richiede SQL Server 2022 CU5 o versione successiva. Sì Parquet, CSV Richiede la configurazione del server: consentire l'esportazione di Polybase.
Istanza SQL gestita di Azure Sì Parquet, CSV Disabilitato per impostazione predefinita
Database SQL di Microsoft Azure No Nessuno Non disponibile
Database SQL su Fabric No Nessuno Non disponibile
  • SQL Server 2022 e versioni successive supportano CETAS ed esportano file Parquet e CSV. L'impostazione Configurazione del server: consenti l'esportazione PolyBase è obbligatoria. L'esportazione CETAS in ADLS Gen2 non è disponibile nelle versioni di SQL Server 2022 prima di CU5.
  • Istanza gestita di SQL di Azure supporta CETAS ed esporta file Parquet e CSV. La guida Disabled by default descrive il suo stato predefinito.
  • database SQL di Azure non supporta CETAS.
  • Il database SQL in Fabric non supporta CETAS.

Per informazioni di riferimento Transact-SQL, vedere CREATE EXTERNAL TABLE AS SELECT (CETAS).

Esempi di avvio rapido

Esempio 1: query ad hoc in un file Parquet (OPENROWSET)

Nessuna tabella esterna necessaria. Funziona in SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure e database SQL in Fabric.

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
    FORMAT = 'PARQUET'
) AS [result];

Esempio 2: Tabella esterna in formato CSV in Archiviazione BLOB di Azure

Questo esempio funziona su tutte le piattaforme SQL che supportano tabelle esterne tramite file CSV.

  • Passaggio 1: Creare una chiave master del database (DMK). Questo passaggio è obbligatorio perché le credenziali archiviano un segreto del token SAS. Tuttavia, puoi saltare questo passaggio se usi l'autenticazione Managed Identity o Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
    
  • Passaggio 2: Creare una credenziale con un token SAS. Omettere l'elemento iniziale ?.

    CREATE DATABASE SCOPED CREDENTIAL MyStorageCred
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
         SECRET = '<your_SAS_token>'; -- omit the leading '?'
    
  • Passaggio 3: Creare un'origine dati esterna.

    CREATE EXTERNAL DATA SOURCE MyAzureStorage
    WITH (
        LOCATION = 'abs://mycontainer@mystorageaccount.blob.core.windows.net',
        CREDENTIAL = MyStorageCred
    );
    
  • Passaggio 4: Creare un formato di file per il file CSV.

    CREATE EXTERNAL FILE FORMAT CsvFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (
            FIELD_TERMINATOR = ',',
            STRING_DELIMITER = '"',
            FIRST_ROW = 2
        )
    );
    
  • Passaggio 5: Creare la tabella esterna.

    CREATE EXTERNAL TABLE dbo.SalesExternal
    (
        OrderId INT,
        OrderDate DATE,
        Amount DECIMAL (18, 2),
        Customer NVARCHAR (100)
    )
    WITH (
        DATA_SOURCE = MyAzureStorage,
        LOCATION = '/data/sales/',
        FILE_FORMAT = CsvFormat
    );
    
  • Passaggio 6: Eseguire una query sulla tabella esterna.

    SELECT *
    FROM dbo.SalesExternal
    WHERE OrderDate >= '2025-01-01';
    

Esempio 3: Interrogare una tabella in un'altra istanza di SQL Server

Questo esempio funziona in SQL Server 2019 (15.x) e versioni successive.

  • Passaggio 1: Creare una chiave master del database (obbligatoria perché le credenziali archivia una password).

    CREATE MASTER KEY ENCRYPTION
    BY PASSWORD = '<password>';
    
  • Passaggio 2: Creare credenziali per l'istanza remota di SQL Server.

    CREATE DATABASE SCOPED CREDENTIAL RemoteSqlCred
    WITH IDENTITY = 'remote_user',
         SECRET = '<password>';
    
  • Passaggio 3: Creare l'origine dati esterna.

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • Passaggio 4: Creare la tabella esterna (nome composto in tre parti in LOCATION).

    CREATE EXTERNAL TABLE dbo.RemoteCustomers
    (
        CustomerId INT,
        CustomerName NVARCHAR (200)
            COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    WITH (
        DATA_SOURCE = RemoteSqlServer,
        LOCATION = 'SalesDB.dbo.Customers'
    );
    
  • Passaggio 5: Interrogare i server.

    SELECT c.CustomerName,
           s.Amount
    FROM dbo.RemoteCustomers AS c
         INNER JOIN dbo.LocalSales AS s
             ON c.CustomerId = s.CustomerId;
    

Esempio 4: Esportare i risultati in Parquet con CETAS

Funziona in SQL Server 2022 (16.x) e versioni successive, Istanza gestita di SQL di Azure.

  • Passaggio 1: Abilitare CETAS (solo SQL Server).

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • Passaggio 2: Creare credenziali e origine dati (riutilizzare da esempi precedenti).

  • Passaggio 3: Creare un formato file per esportare in Parquet.

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • Passaggio 4: Esportare i risultati delle query.

    CREATE EXTERNAL TABLE dbo.Sales2025Export
    WITH (
        DATA_SOURCE = MyAzureStorage,
        LOCATION = '/exports/sales_2025.parquet',
        FILE_FORMAT = ParquetFormat
    ) AS
    SELECT *
    FROM Sales.Orders
    WHERE OrderDate >= '2025-01-01';
    

Blocchi predefiniti T-SQL per PolyBase

Prima di implementare qualsiasi scenario, comprendere gli oggetti T-SQL di base usati da PolyBase e come interagiscono:

Diagramma che mostra PolyBase Transact-SQL oggetti e le relative relazioni.

Diagramma che mostra gli oggetti T-SQL PolyBase e le relative relazioni, dall'autenticazione (chiave master del database, credenziali) tramite origini dati e formati di file ai metodi di query (Tabella esterna, OPENROWSET, BULK INSERT, CETAS).

Per informazioni di riferimento complete su Transact-SQL per tutti gli oggetti, vedere Riferimento Transact-SQL PolyBase.

Importante

Verificare la mappatura dei tipi di dati per il formato file esterno. Quando si crea un formato di file esterno o si eseguono query su OPENROWSET, PolyBase esegue automaticamente il mapping dei tipi di dati di origine (Parquet, CSV, Delta, Oracle, Teradata, MongoDB) ai tipi di dati di SQL Server. I tipi non corrispondenti possono causare troncamenti silenziosi, perdita di precisione o errori nelle query. Ad esempio, un file Parquet DECIMAL(38,18) viene mappato su DECIMAL(18,0). Esaminare le tabelle di mappatura prima di definire colonne di tabella esterne o clausola WITH. Per informazioni di riferimento complete, vedere Mapping dei tipi con PolyBase.

Quando è necessario CREATE MASTER KEY?

Viene creata una chiave master del database usando la sintassi CREATE MASTER KEY. La DMK crittografa i segreti archiviati all'interno delle credenziali con ambito nel database. È obbligatorio solo quando la credenziale contiene un valore segreto, ovvero quando archivia una password, un token o una chiave di accesso.

  • DMK è obbligatorio (le credenziali memorizzano un segreto):

    Tipo di autenticazione Valore della proprietà IDENTITY Ha un segreto DMK
    Token di firma di accesso condiviso 'SHARED ACCESS SIGNATURE' Sì Obbligatorio
    Chiave di accesso S3 'S3 ACCESS KEY' Sì Obbligatorio
    Accesso SQL/autenticazione di base '<username>' Sì Obbligatorio
    Chiave di accesso dell'account di archiviazione '<storage_account_name>' Sì Obbligatorio
    • Una credenziale di token SAS utilizza IDENTITY = 'SHARED ACCESS SIGNATURE' e memorizza un valore segreto, quindi richiede una chiave principale del database.
    • Una credenziale di chiave di accesso S3 utilizza IDENTITY = 'S3 ACCESS KEY' e memorizza un valore segreto, quindi richiede una chiave principale del database.
      • Un login SQL o una credenziale di autenticazione di base utilizza IDENTITY = '<username>' e memorizza un valore segreto, quindi richiede una chiave principale del database.
    • La credenziale di una chiave di accesso di un account di archiviazione utilizza IDENTITY = '<storage_account_name>' e memorizza un valore segreto, quindi richiede una chiave principale del database.
  • DMK non è obbligatorio (nessun segreto archiviato):

    Tipo di autenticazione Valore della proprietà IDENTITY Ha un segreto DMK
    Identità gestita 'Managed Identity' No Non obbligatorio
    Microsoft Entra ID 'User Identity' oppure 'Managed Identity' No Non obbligatorio
    • Una credenziale di Identità Gestita non utilizza IDENTITY = 'Managed Identity' e non conserva alcun segreto, quindi non richiede una chiave maestra del database.
    • Una credenziale Microsoft Entra ID non utilizza IDENTITY = 'User Identity' o IDENTITY = 'Managed Identity' e non conserva alcun segreto, quindi non richiede una chiave principale del database.

Suggerimento

Se la tua CREATE DATABASE SCOPED CREDENTIAL dichiarazione non include un segreto, non hai bisogno di un DMK. Identità gestita e microsoft Entra ID delegano l'attendibilità alla piattaforma. Il database non archivia password o token.

Esempi:

In questa query di esempio, la DMK è obbligatoria (la credenziale archivia un token SAS).

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL SasCred
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = '<your_SAS_token>';

In questa query di esempio la DMK non è necessaria (Identità gestita, nessun segreto).

CREATE DATABASE SCOPED CREDENTIAL ManagedIdentityCred
WITH IDENTITY = 'Managed Identity';

In questa query di esempio, la DMK non è necessaria (pass-through di Microsoft Entra, nessun segreto).

CREATE DATABASE SCOPED CREDENTIAL EntraIdCred
WITH IDENTITY = 'User Identity';

Accesso remoto ai dati con OPENROWSET e tabelle esterne

SQL Server offre tre approcci distinti per eseguire query sui dati remoti. È possibile scegliere l'approccio corretto quando si conoscono le differenze nella sintassi, nell'autenticazione e nell'architettura.

Avvicinarsi Sintassi Si connette a Autenticazione Servizi PolyBase Platforms
Query OLE DB OPENROWSET(provider, connection, query) Qualsiasi origine OLE DB tramite MSOLEDBSQL, SQLOLEDB o altri provider Autenticazione SQL, autenticazione di Windows, ID Microsoft Entra (MSOLEDBSQL) No SQL Server (tutte le versioni supportate)
Query di file in SQL Server 2022 (16.x) e SQL Server 2019 (15.x) OPENROWSET(BULK ...) File su disco locale, rete o cloud (BLOB di Azure, ADLS, S3, OneLake) Token SAS, chiave di accesso, identità gestita, Microsoft Entra ID Sì per il cloud 1; No per il locale SQL Server 2022 (16.x) e SQL Server 2019 (15.x)
File query in SQL Server 2025 (17.x) e versioni successive OPENROWSET(BULK ...) File su disco locale, rete o cloud (BLOB di Azure, ADLS, S3, OneLake) Token SAS, chiave di accesso, identità gestita, Microsoft Entra ID No SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Fabric
Connettori PolyBase CREATE EXTERNAL TABLE con CREATE EXTERNAL DATA SOURCE, sqlserver://, oracle://, teradata://, mongodb://, odbc:// Sql Server remoto, Oracle, Teradata, MongoDB, origini ODBC Solo autenticazione SQL Sì SQL Server 2019 (15.x) e versioni successive (Windows); SQL Server 2025 (17.x) e versioni successive (Linux)

1 Per l'accesso ai file cloud in SQL Server 2022 (16.x), è necessario installare la funzione PolyBase.

  • Le query OLE DB usano OPENROWSET(provider, connection, query) per connettersi a qualsiasi origine dati OLE DB tramite MSOLEDBSQL, SQLOLEDB o un altro provider in tutte le versioni supportate di SQL Server. Supportano l'autenticazione SQL, autenticazione di Windows e Microsoft Entra ID con MSOLEDBSQL, e non richiedono l'installazione dei servizi PolyBase.
  • Le query di file usano OPENROWSET(BULK ...) per leggere file su disco locale, condivisioni di rete o archiviazione cloud come Archiviazione BLOB di Azure, ADLS, S3 o OneLake utilizzando un token SAS, una chiave di accesso, una Managed Identity o Microsoft Entra ID. Sono supportati per file locali e di rete in SQL Server 2005 e versioni successive, per file cloud in SQL Server 2022 (16.x) e versioni successive, e in database SQL di Azure, Istanza gestita di SQL di Azure e database SQL in Fabric. Le query file non richiedono servizi PolyBase per file locali o file cloud in SQL Server 2022 (16.x) e versioni successive.
  • I connettori PolyBase utilizzano CREATE EXTERNAL TABLE con oracle:// e il percorso sqlserver://, teradata://, mongodb://, odbc:// o CREATE EXTERNAL DATA SOURCE per connettersi a origini dati remote SQL Server, Oracle, Teradata, MongoDB o ODBC. Richiedono autenticazione SQL e servizi PolyBase in SQL Server 2019 (15.x) e versioni successive su Windows e SQL Server 2025 (17.x) e versioni successive su Linux. Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE (Transact-SQL).

Quando usare ogni approccio

Usare OLE DB OPENROWSET per:

  • Usa OLE DB OPENROWSET per query rapide e ad hoc una sola volta senza creare oggetti persistenti.
  • Usa OLE DB OPENROWSET per l'autenticazione di Microsoft Entra ID o Managed Identity tramite MSOLEDBSQL.
  • Usa OLE DB OPENROWSET per evitare dipendenze dal servizio PolyBase.
  • Usa OLE DB OPENROWSET per connetterti a qualsiasi fonte di dati che abbia un provider OLE DB.

Usare File OPENROWSET(BULK) per:

  • Usa file OPENROWSET(BULK ...) per l'esplorazione ad hoc dei file e la scoperta dello schema.
  • Usa file OPENROWSET(BULK ...) per trasformazioni rapide e anteprime prima di impegnarti su una definizione di tabella.
  • Usa file OPENROWSET(BULK ...) per trasformazioni flessibili di colonne inline come casting, filtraggio e colonne calcolate.
  • Usa file OPENROWSET(BULK ...) per dati che non cambiano frequentemente e non richiedono metadati persistenti.

Usare i connettori PolyBase con CREATE EXTERNAL TABLE per:

  • Usa connettori PolyBase con CREATE EXTERNAL TABLE definizioni di tabella persistenti e riutilizzabili a cui più utenti o applicazioni accedono.
  • Usa i connettori PolyBase con CREATE EXTERNAL TABLE per i carichi di lavoro di produzione che richiedono statistiche e l'ottimizzazione dei piani di query.
  • Usa i connettori PolyBase con CREATE EXTERNAL TABLE per eseguire il calcolo pushdown su origini dati remote come Oracle e SQL Server.
  • Usa i connettori PolyBase con CREATE EXTERNAL TABLE per la governance condivisa e la sicurezza; dopo la creazione della tabella, gli utenti hanno bisogno solo SELECT di permesso.
  • Usare i connettori PolyBase con CREATE EXTERNAL TABLE quando l'autenticazione SQL è disponibile per l'origine remota.

OPENROWSET (OLE DB): query remote ad hoc (nessun servizio PolyBase richiesto)

Il formato OLE DB di OPENROWSET si connette a un'origine dati remota tramite un provider OLE DB, esegue una query pass-through e restituisce i risultati come set di righe. Si tratta di un'alternativa monouso ad hoc a un server collegato. Non vengono creati metadati persistenti. Questa sintassi non richiede servizi PolyBase e non supporta file cloud o origini dati esterne.

Questa query di esempio si connette a un server SQL remoto tramite OLE DB (non PolyBase).

SELECT *
FROM OPENROWSET (
    'MSOLEDBSQL',
    'Server=remote-server;Database=AdventureWorks;Trusted_Connection=yes;',
    'SELECT TOP 10 * FROM AdventureWorks.Sales.SalesOrderHeader'
);

OPENROWSET(BULK) - Interrogazioni basate su file (PolyBase)

Il BULK formato di OPENROWSET legge i dati direttamente dai file. In SQL Server 2019 (15.x) e versioni precedenti legge da percorsi di file LOCALI o UNC e richiede un file di formato. In SQL Server 2022 (16.x) e versioni successive è possibile leggere dall'archiviazione cloud usando i DATA_SOURCE parametri e FORMAT . Questo approccio è la versione integrata di PolyBase usata per la virtualizzazione dei dati.

Nel contesto di PolyBase e della virtualizzazione dei dati, quando si fa riferimento a OPENROWSET, questa guida fa riferimento alla sintassi OPENROWSET(BULK ...) con una clausola FORMAT per eseguire query su file esterni.

Esempi:

L'esempio di query legge un file Parquet da Archiviazione BLOB di Azure (SQL Server 2022 e versioni successive).

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'data/sales/*.parquet',
    DATA_SOURCE = 'MyAzureStorage',
    FORMAT = 'PARQUET'
) AS [result];

Questa query di esempio legge un file Parquet con un percorso inline (database SQL di Azure, Istanza gestita di SQL di Azure).

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
    FORMAT = 'PARQUET'
) AS [result];

Quando usare OPENROWSET e tabelle esterne

Sia OPENROWSET(BULK ...) sia le tabelle esterne consentono di eseguire query su dati esterni con T-SQL, ma sono progettate per casi d'uso diversi. La tabella seguente riepiloga le differenze principali per decidere quale approccio si adatta allo scenario.

Capability OPENROWSET(BULK ...) Tabella esterna
Purpose Esplorazione ad hoc e query una tantum Definizione di tabella persistente riutilizzabile
Metadati archiviati nel database No. Nessun elemento viene salvato dopo l'esecuzione della query Sì. La definizione della tabella, l'origine dati e il formato di file vengono archiviati come oggetti di database
Definizione dello schema Dedotto automaticamente dal file (Parquet) o specificato in linea con una clausola WITH Definito in modo esplicito nell'istruzione CREATE EXTERNAL TABLE
Autorizzazioni Richiede ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS Una volta creata, l'autorizzazione standard SELECT per la tabella è sufficiente
Colonne calcolate Sì. Aggiungere espressioni e colonne calcolate nell'elenco SELECT . Le funzioni di metadati come filename() e filepath() sono disponibili solo qui. No. Elenco di colonne fisse; eseguire trasformazioni in una vista o nella query che legge la tabella esterna
Statistica Istanza gestita di SQL di Azure: statistiche manuali a colonna singola tramite sys.sp_create_openrowset_statistics. Vedere statistiche manuali di OPENROWSET.

SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, database SQL in Fabric: creazione automatica di statistiche sui predicati. Le statistiche manuali OPENROWSET non sono supportate su SQL Server.
Supporto completo CREATE STATISTICS in tutte le piattaforme, oltre alla creazione automatica in SQL Server 2022 (16.x) e versioni successive. Vedere Creare statistiche manuali della tabella esterna.
Pushdown Supporto limitato. Il motore potrebbe trasferire i filtri fino all'analisi dei file, ma non c'è alcun trasferimento nelle origini remote di database RDBMS. Sì. Supporta il calcolo pushdown per i connettori RDBMS (SQL Server, Oracle, Teradata, MongoDB)
migliore per Esplorazione dei dati, individuazione dello schema, creazione di prototipi di query, caricamenti di dati monouso, trasformazioni flessibili Carichi di lavoro di produzione, query ripetute, accesso condiviso tra utenti, dashboard e report
  • OPENROWSET(BULK ...) è il migliore per l'esplorazione ad hoc e per query puntuali, mentre una tabella esterna è migliore per definizioni di tabelle persistenti e riutilizzabili.
  • OPENROWSET(BULK ...) non memorizza i metadati nel database dopo l'esecuzione della query, mentre una tabella esterna memorizza la definizione della tabella, la fonte dei dati e il formato file come oggetti del database.
  • OPENROWSET(BULK ...) deduce lo schema automaticamente da un file Parquet o definisce lo schema in linea con una WITH clausola, mentre una tabella esterna definisce esplicitamente lo schema nell'istruzione CREATE EXTERNAL TABLE .
  • OPENROWSET(BULK ...) richiede ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS, mentre una tabella esterna può essere interrogata da utenti che necessitano solo del permesso standard SELECT una volta che la tabella esiste.
  • OPENROWSET(BULK ...) Supporta colonne calcolate nelle funzioni di query e metadati come filename() e filepath(), mentre una tabella esterna ha una lista di colonne fissa e richiede trasformazioni in una vista o nella query che legge la tabella esterna.
  • OPENROWSET(BULK ...)ha un supporto limitato per le statistiche: Istanza gestita di SQL di Azure può essere utilizzato sys.sp_create_openrowset_statistics per statistiche a colonna singola, ma SQL Server 2022 (16.x) e versioni successive, database SQL di Azure e SQL Database in Fabric creano automaticamente statistiche sui predicati. Le statistiche manuali OPENROWSET non sono supportate su SQL Server, database SQL di Azure e SQL database in Fabric. Una tabella esterna supporta completamente la funzionalità CREATE STATISTICS in tutte le piattaforme, oltre alle statistiche automatiche in SQL Server 2022 (16.x) e versioni successive, database SQL di Azure e database SQL in Fabric. Consulta Statistiche manuali di OPENROWSET e Creare statistiche manuali per tabelle esterne.
  • OPENROWSET(BULK ...) ha un pushdown limitato e nessun pushdown verso sorgenti RDBMS remote, mentre una tabella esterna supporta il calcolo pushdown per i connettori RDBMS.
  • OPENROWSET(BULK ...) è ideale per l'esplorazione dei dati, la scoperta di schemi, la prototipazione, carichi una tantum e trasformazioni flessibili, mentre una tabella esterna è la migliore per carichi di lavoro in produzione, query ripetute, accesso condiviso, dashboard e reportistica.

Usare OPENROWSET quando è necessaria flessibilità

Usare OPENROWSET per esplorare un file, testare schemi diversi o aggiungere colonne e trasformazioni calcolate senza creare oggetti persistenti. Ad esempio, è possibile estrarre il percorso del file come colonna, eseguire il cast dei tipi di dati inline o filtrare le espressioni calcolate in una singola query.

Questa query di esempio include colonne calcolate e trasformazioni:

SELECT result.filename() AS [FileName],
       result.filepath(1) AS [Year],
       result.filepath(2) AS [Month],
       CAST (OrderDate AS DATE) AS OrderDate,
       Amount,
       OrderDate
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*/*/*/*.parquet',
    FORMAT = 'PARQUET'
) AS result
WHERE result.filepath(1) = '2025';

Suggerimento

Le funzioni filepath() e filename() sono disponibili nel database SQL di Azure, in Istanza gestita di Azure SQL e in SQL Server 2022 (16.x) e versioni successive. Consentono di filtrare in base alle parti del percorso del file (eliminazione della partizione) ed esporre il nome del file di origine come colonna, che non è direttamente possibile con le tabelle esterne.

Utilizzare tabelle esterne quando è necessaria la persistenza e la governance

Usare tabelle esterne quando più utenti o applicazioni devono eseguire ripetutamente query negli stessi dati esterni. Definire lo schema, l'origine dati e le credenziali una sola volta e archiviarli nel database. I consumatori necessitano SELECT solo dell'autorizzazione sulla tabella.

Le tabelle esterne supportano anche le statistiche usate da Query Optimizer per creare piani di esecuzione migliori. È possibile creare le statistiche manualmente o consentire al motore di crearle automaticamente (SQL Server 2022 (16.x) e versioni successive.

Questa query di esempio crea statistiche su una tabella esterna per piani di query migliori.

CREATE STATISTICS Stats_OrderDate
ON dbo.SalesExternal(OrderDate)
WITH FULLSCAN;

Per altre informazioni sulle statistiche per entrambi gli approcci, vedere Considerazioni sulle prestazioni di PolyBase - Statistiche.

BULK INSERT vs. OPENROWSET(BULK): quale dovrei usare?

Sia BULK INSERT che OPENROWSET(BULK ...) importano dati da file in SQL Server utilizzando lo stesso motore di caricamento massivo sottostante. Tuttavia, differiscono nella sintassi, nella flessibilità e nelle operazioni che è possibile eseguire con i risultati. Nella tabella seguente sono riepilogate le differenze principali:

Annotazioni

L'istruzione standalone BULK INSERT non è supportata nel database SQL in Fabric. Per acquisire dati, usa INSERT ... SELECT con OPENROWSET(BULK ...) in OneLake.

Capability BULK INSERT OPENROWSET(BULK ...)
Scopo di base Carica i dati da un file direttamente in una tabella di destinazione Restituisce un set di righe utilizzato in un'istruzione SELECT o INSERT ... SELECT
Modello di utilizzo Istruzione autonoma: BULK INSERT <table> FROM '<file>' Deve essere usato all'interno di una query: SELECT * FROM OPENROWSET(BULK ...) o INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)
Richiede una tabella di destinazione? Sì. Scrive sempre direttamente in una tabella No. È possibile SELECT senza inserirlo in alcuna posizione oppure inserirlo in qualsiasi tabella o tabella temporanea.
Trasformazioni delle colonne durante il caricamento Supporto limitato. I dati passano dal file alla tabella così com'è (mapping controllato dal file di formato o dall'ordine delle colonne) Supporto completo. È possibile aggiungere espressioni, CASTfiltri WHERE , JOIN altre tabelle e colonne calcolate nell'ambiente circostante SELECT
Suggerimenti per la tabella La WITH clausola include il supporto per BATCHSIZE, CHECK_CONSTRAINTSFIRE_TRIGGERS, KEEPIDENTITY, , KEEPNULLS, TABLOCKe altro ancora Supporta hint sulla tabella tramite la sintassi INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...)
Importazione a singolo valore di Grandi Oggetti (LOB) Non supportato Sì. Supporta SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB per importare un intero file come un valore varbinary(max), varchar(max)o nvarchar(max)
Formattare i file Sì. Supportato tramite (XML e non XML) Sì. Supportato (XML e non XML)
Accesso ai file nel cloud DATA_SOURCEsupporta Archiviazione BLOB di Azure in SQL Server 2017 (14.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure. Anche SQL Server 2019 CU11 e aggiornamenti successivi supportano ADLS Gen2. Lo storage compatibile con S3 non è supportato. DATA_SOURCE supporta Archiviazione BLOB di Azure in SQL Server 2017 (14.x) e nelle versioni successive, ADLS Gen2 in SQL Server 2019 CU11 e nelle versioni successive e lo storage compatibile con S3 in SQL Server 2022 (16.x) e nelle versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure supportano Archiviazione BLOB di Azure e ADLS Gen2. Il database SQL in Fabric supporta OneLake e la memoria esterna tramite scorciatoie OneLake.
File Parquet o Delta Non supportato. Solo testo CSV/delimitato Sì. SQL Server 2022 (16.x) e versioni successive, Istanza gestita di SQL di Azure e database SQL di Azure supportano FORMAT = 'PARQUET' e FORMAT = 'DELTA'; il database SQL in Fabric supporta FORMAT = 'PARQUET' ma non DELTA. Per altre informazioni, vedere OPENROWSET BULK (Transact-SQL).
Autorizzazione richiesta ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS, più INSERT nella tabella di destinazione ADMINISTER BULK OPERATIONS oppure ADMINISTER DATABASE BULK OPERATIONS
Registrazione minima Sì. Supportato nei modelli di recupero con registrazione minima o registrazione delle operazioni bulk con TABLOCK Sì. Supportato quando usato con INSERT ... SELECT e TABLOCK
  • BULK INSERT carica i dati da un file direttamente in una tabella target, mentre OPENROWSET(BULK ...) restituisce un set di righe che puoi usare nell'istruzione SELECT o INSERT ... SELECT .
  • BULK INSERT è un'istruzione autonoma, mentre OPENROWSET(BULK ...) deve essere usata all'interno di una query come SELECT * FROM OPENROWSET(BULK ...) o INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...).
  • BULK INSERT scrive sempre direttamente in una tabella di destinazione, mentre OPENROWSET(BULK ...) può SELECT da un file senza inserirlo da alcuna parte oppure inserirlo in una tabella o tabella temporanea.
  • BULK INSERT ha un supporto limitato per le trasformazioni di colonna perché i dati fluiscono dal file alla tabella as-is, con la mappatura controllata da un file di formato o un ordine di colonna. OPENROWSET(BULK ...) supporta espressioni, CAST, filtri WHERE, JOIN e colonne calcolate nell'SELECT circostante.
  • BULK INSERT usa una WITH clausola per BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK, e altri indizi. OPENROWSET(BULK ...) supporta suggerimenti di tabella tramite INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...).
  • BULK INSERT Non supporta l'importazione a valore singolo per oggetti grandi. OPENROWSET(BULK ...) supporta SINGLE_BLOB, SINGLE_CLOB, e SINGLE_NCLOB per importare un intero file come valore varbinary(max), varchar(max) o nvarchar(max ), rispettivamente.
  • Sia BULK INSERT che OPENROWSET(BULK ...) supportano file in formato XML e non XML.
  • Per l'accesso ai file cloud con BULK INSERT, il DATA_SOURCE parametro supporta Archiviazione BLOB di Azure in SQL Server 2017 (14.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure. SQL Server 2019 CU11 e aggiornamenti successivi supportano anch'essi ADLS Gen2, ma BULK INSERT non supportano lo storage compatibile con S3. Per OPENROWSET(BULK ...), DATA_SOURCE supporta Archiviazione BLOB di Azure in SQL Server 2017 (14.x) e versioni successive, ADLS Gen2 in SQL Server 2019 CU11 e versioni successive e l'archiviazione compatibile con S3 in SQL Server 2022 (16.x) e versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure supportano Archiviazione BLOB di Azure e ADLS Gen2. Il database SQL in Fabric supporta OneLake e la memoria esterna tramite scorciatoie OneLake.
  • BULK INSERT non supporta file Parquet o Delta e supporta solo CSV o testo delimitato. OPENROWSET(BULK ...)supporta FORMAT = 'PARQUET' e FORMAT = 'DELTA' in SQL Server 2022 (16.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure. Il database SQL in Fabric supporta FORMAT = 'PARQUET' ma non FORMAT = 'DELTA'. Per altre informazioni, vedere OPENROWSET BULK (Transact-SQL).
  • BULK INSERT richiede ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS oltre all'autorizzazione INSERT sulla tabella di destinazione, mentre OPENROWSET(BULK ...) richiede ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS.
  • BULK INSERT supporta una registrazione minima nel modello di recupero semplice o bulk-logged con TABLOCK. OPENROWSET(BULK ...) Supporta un logging minimo quando viene usato con INSERT ... SELECT e TABLOCK.

Quando scegliere BULK INSERT

Usare BULK INSERT quando si dispone di un caricamento semplice da file a tabella e non è necessario trasformare, filtrare o unire i dati durante l'importazione. Usa una sintassi più semplice per csv o altri file delimitati:

Questa query di esempio carica un file CSV da Archiviazione BLOB di Azure direttamente in una tabella.

BULK INSERT Sales.Invoices
FROM 'invoices/inv-2025-01.csv'
WITH (
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
);

Questa query di esempio carica un file locale con un file di formato per il mapping delle colonne.

BULK INSERT dbo.Products
FROM 'C:\Data\products.csv'
WITH (
    FORMATFILE = 'C:\Data\products.fmt',
    FIRSTROW = 2,
    TABLOCK
);

Quando scegliere OPENROWSET(BULK)

Usare OPENROWSET(BULK ...) quando sono necessarie una o più delle condizioni seguenti:

  • Usalo OPENROWSET(BULK ...) per interrogare o anteprima i dati dei file senza prima creare una tabella.
  • Da usare OPENROWSET(BULK ...) per trasformare, filtrare o unire i dati durante l'importazione.
  • Lo uso OPENROWSET(BULK ...) per caricare file Parquet o Delta perché BULK INSERT non supporta questi formati.
  • Usare OPENROWSET(BULK ...) per importare un intero file come un singolo valore LOB con SINGLE_BLOB, SINGLE_CLOB, o SINGLE_NCLOB.

Questa query di esempio visualizza in anteprima un file CSV da Archiviazione BLOB di Azure senza inserire i dati in nessun posto.

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'invoices/inv-2025-01.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ','
) AS src;

In questa query di esempio vengono inseriti dati con trasformazione e filtro.

INSERT INTO Sales.Invoices (InvoiceDate, Amount, Customer)
SELECT CAST (InvoiceDate AS DATE),
       Amount * 1.1, -- Apply a 10% markup
       UPPER(Customer)
FROM OPENROWSET (
    BULK 'invoices/inv-2025-01.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2
) WITH (
    InvoiceDate VARCHAR (10),
    Amount DECIMAL (18, 2),
    Customer VARCHAR (100)
) AS src
WHERE Amount IS NOT NULL;

Questa query di esempio carica un file Parquet (non possibile con BULK INSERT).

INSERT INTO Sales.Invoices
SELECT *
FROM OPENROWSET (
    BULK 'data/invoices/*.parquet',
    DATA_SOURCE = 'MyAzureStorage',
    FORMAT = 'PARQUET') AS src;

Questa query di esempio importa un intero file XML come singolo valore varbinary(max).

INSERT INTO dbo.XmlDocuments (DocContent)
SELECT BulkColumn
FROM OPENROWSET (
    BULK 'C:\Data\catalog.xml',
    SINGLE_BLOB
) AS x;

Suggerimento

Un approccio consiste nell'iniziare con OPENROWSET(BULK ...) in un SELECT per esplorare e convalidare i dati dei file, quindi passare a BULK INSERT per il carico di produzione finale, se non sono necessarie trasformazioni. Se hai bisogno del supporto Parquet o Delta o del filtro in-linea, resta con OPENROWSET.

Per altre informazioni, vedere le guide correlate seguenti:

Funzioni di metadati utili

Quando interroghi file esterni usando OPENROWSET o tabelle esterne, utilizza le funzioni e le procedure integrate per ispezionare i metadati dei file, individuare gli schemi e implementare query che tengono conto delle partizioni.

filepath() e filename()

Le filepath() funzioni e filename() restituiscono parti del percorso del file o del nome file per ogni riga nel set di risultati. Sono particolarmente utili per:

  • Eliminazione delle partizioni: filtra i segmenti di cartella (ad esempio, le partizioni anno/mese/giorno) in modo che il motore legga solo i file corrispondenti invece di analizzare tutti gli elementi.

  • Esposizione dei metadati di origine: includere il nome o il percorso del file di origine come colonna nei risultati della query, utile per il controllo o il debug.

Funzione Restituzioni Esempio
filename() Nome file (incluso l'estensione) del file di origine per ogni riga sales_2025_01.parquet
filepath(N) Il Nesimo segmento di cartella dal carattere jolly (*) nel percorso BULK, dove N inizia da 1 Per il percorso sales/2025/01/*.parquet, filepath(1) restituisce 2025, filepath(2) restituisce 01

Si applica a: Database SQL di Azure, Istanza gestita di SQL di Azure, SQL Server 2022 (16.x) e versioni successive, database SQL in Fabric.

Questa query di esempio usa filepath() per l'eliminazione delle partizioni e filename() per identificare i file di origine. Legge solo i file nella /2025/ cartella e legge solo i file nella /06/ sottocartella.

SELECT result.filename() AS SourceFile,
       result.filepath(1) AS [Year],
       result.filepath(2) AS [Month],
       *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*/*/*.parquet',
    FORMAT = 'PARQUET'
) AS result
WHERE result.filepath(1) = '2025' 
      AND result.filepath(2) = '06';

Suggerimento

Inserire filepath() i filtri nella clausola WHERE anziché in una sottoquery o in un CTE. Quando il filtro si trova nella WHERE clausola , il motore può eseguire l'eliminazione della partizione a livello di analisi dei file, riducendo in modo significativo le operazioni di I/O.

sp_describe_first_result_set - Individuare i tipi di colonna OPENROWSET

Il motore deduce automaticamente i tipi di dati delle colonne quando si usano file Parquet (OPENROWSET) attraverso l'inferenza dello schema. I tipi dedotti potrebbero essere più grandi del necessario. Ad esempio, le colonne di caratteri vengono spesso dedotti come varchar(8000) perché i metadati Parquet non includono una lunghezza massima. Questa scelta può ridurre le prestazioni e consumare più memoria.

Usare sp_describe_first_result_set per esaminare lo schema dedotto prima di finalizzare la query. Dopo aver visualizzato i tipi dedotti, specificare i tipi più stretti in una WITH clausola per migliorare le prestazioni.

  • Passaggio 1: Esaminare lo schema dedotto.

    EXECUTE sp_describe_first_result_set N'
    SELECT *
    FROM OPENROWSET(
        BULK ''abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet'',
        FORMAT = ''PARQUET''
    ) AS result';
    

    L'output mostra il nome di ogni colonna, il tipo di dati dedotto, la lunghezza massima, la precisione e la scala. Se vedi varchar(8000) dove varchar(100) sarebbe sufficiente, superalo.

  • Passaggio 2: Usare tipi espliciti per ottenere prestazioni migliori.

    SELECT TOP 100 *
    FROM OPENROWSET (
        BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
        FORMAT = 'PARQUET'
    ) WITH (
        OrderId INT,
        OrderDate DATE,
        Amount DECIMAL (18, 2),
        Customer VARCHAR (100) -- much narrower than the inferred varchar(8000)
    ) AS result;
    

L'inferenza dello schema funziona solo con i file Parquet. Per i file CSV, specificare sempre le definizioni di colonna in una WITH clausola (per OPENROWSET) o nell'istruzione CREATE EXTERNAL TABLE . sp_describe_first_result_setè un SQL Server generale, database SQL di Azure, Istanza gestita di SQL di Azure e SQL database in procedura Fabric, ma è particolarmente utile per OPENROWSET le query. Per maggiori informazioni, vedi sp_describe_first_result_set.

Prestazioni, risoluzione dei problemi e procedure consigliate

Dopo aver implementato la virtualizzazione dei dati, usare queste guide per ottimizzare le prestazioni, diagnosticare i problemi e garantire la conformità alla produzione:

Area Articolo dettagli
Prestazioni di PolyBase Considerazioni sulle prestazioni in PolyBase per SQL Server Statistiche, pushdown, parallelismo e gestione della memoria
Calcolo *pushdown* Calcoli di pushdown in PolyBase Specifica quali operazioni eseguono il push sull'origine remota
Come stabilire se si è verificato il pushdown Come stabilire se si è verificato un pushdown esterno Piani di query e DMV
Risoluzione dei problemi Monitorare e risolvere i problemi di PolyBase Errori comuni e soluzioni
Connettività Kerberos Risolvere i problemi di connettività di PolyBase Kerberos
Domande frequenti Domande frequenti su PolyBase
Errori e soluzioni Errori di PolyBase e possibili soluzioni