Connecter, interroger et exporter des données avec PolyBase

S'applique à : SQL Server 2016 (13.x) et versions ultérieures Azure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

La virtualisation des données vous permet d’exécuter des requêtes Transact-SQL (T-SQL) sur des données externes sans les charger dans votre base de données. Vous définissez une source de données externe, un format de fichier facultatif et une table externe, puis interrogez la table externe comme SELECT n’importe quelle autre table.

Ce guide vous aide à :

  • Découvrez les fonctionnalités de PolyBase pour votre plateforme SQL et la prise en charge des versions.
  • Choisissez entre OPENROWSETles tables externes et BULK INSERT pour interroger ou ingérer des données.
  • Suivez les liens pas à pas pour les scénarios courants.
  • Passez en revue les performances, la résolution des problèmes et les meilleures pratiques pour les charges de travail de production.

Support de la plateforme

Cas d’utilisation courants

Le tableau suivant décrit les scénarios d’utilisation possibles.

Scénario Utilisation
Exploration de fichiers ad hoc OPENROWSET(BULK ...)
Requête de fichiers réutilisables pour le BI ou le reporting Tables externes sur des fichiers
Interrogation inter-bases de données (SQL Server, Oracle, Teradata, MongoDB, ODBC) Connecteurs PolyBase avec des tables externes
Exportation des résultats de la requête vers des fichiers CREATE EXTERNAL TABLE AS SELECT (CETAS)
Ingestion en bloc dans des tables BULK INSERT ou OPENROWSET(BULK ...) avec INSERT ... SELECT
  • Pour l’exploration de fichiers ad hoc, utilisez OPENROWSET(BULK ...) pour inspecter des fichiers sans créer de table réutilisable.
  • Pour les requêtes de fichiers réutilisables dans les scénarios de BI ou de reporting, utilisez des tables externes plutôt que des fichiers pour faire persister un schéma et partager les résultats entre requêtes.
  • Pour l’interrogation multi-base de données, utilisez des connecteurs PolyBase avec des tables externes pour accéder à SQL Server, Oracle, Teradata, MongoDB ou ODBC.
  • Pour exporter les résultats des requêtes vers des fichiers, utilisez CREATE EXTERNAL TABLE AS SELECT (CETAS) pour écrire des sorties Parquet ou CSV en dehors de la base de données.
  • Pour l’ingestion massive dans les tables, utilisez BULK INSERT ou OPENROWSET(BULK ...) avec INSERT ... SELECT pour charger les données des fichiers dans les tables de la base de données.

Quelles fonctionnalités sont disponibles à quel endroit ?

Le tableau suivant montre quelles fonctionnalités principales de PolyBase et de virtualisation des données sont disponibles sur chaque plateforme SQL à partir de SQL Server 2019. Pour la disponibilité des fonctionnalités dans SQL Server 2016 et SQL Server 2017 sous Windows, voir fonctionnalités et limitations de PolyBase. Utilisez ce tableau pour déterminer ce que vous pouvez faire sur votre plateforme avant d’utiliser les guides détaillés.

Fonctionnalité SQL Server 2019 SQL Server 2022 SQL Server 2025 Azure SQL Database Azure SQL Managed Instance (Instance gérée Azure SQL) Base de données SQL dans Microsoft Fabric
tables externes Oui Oui Oui Oui Oui Oui
OPENROWSET (BULK) Oui 1 Oui Oui Oui Oui Oui
CETAS (exportation) Non Oui Oui Non Oui Non
Fichiers CSV / délimités Oui 2 Oui Oui Oui Oui Oui
Fichiers Parquet Non Oui Oui Oui Oui Oui
Tables Delta Lake Non Oui Oui Non Non Non
Se connecter à un autre serveur SQL Server Oui Oui Oui Non Non Non
Se connecter à Azure SQL Database ou Azure SQL Managed Instance Oui 3 Oui 3 Oui 3 Non Non Non
Se connecter à Oracle / Teradata / MongoDB Oui Oui Oui Non Non Non
Se connecter à Stockage Blob Azure Oui Oui Oui Oui Oui Non
Se connecter à ADLS Gen2 Oui 5 Oui Oui Oui Oui Non
Se connecter au stockage compatible S3 Non Oui Oui Non Non Non
Se connecter à OneLake (Fabric) Non Non Non Non Non Oui
Calcul pushdown Oui Oui Oui Non Non Non
Authentification d’identité managée Non Non Oui 4 Oui Oui Non

1 SQL Server 2019 (15.x) prend en charge OPENROWSET(BULK...) les chemins de fichiers locaux et réseau. Dans SQL Server 2022 (16.x) et versions ultérieures, OPENROWSET(BULK...) prend également en charge la lecture à partir du stockage cloud avec FORMAT = 'PARQUET', FORMAT = DELTAet FORMAT = 'CSV'.

La prise en charge des fichiers CSV par 2 dans SQL Server 2019 (15.x) nécessitait Hadoop. Dans SQL Server 2022 (16.x) et versions ultérieures, CSV est pris en charge en mode natif sans Hadoop.

3 Utilise le connecteur SQL Server (sqlserver://). Les informations d’identification définies au niveau de la base de données pointent vers le point de terminaison SQL. Utilisez les mêmes étapes que pour la connexion à une autre instance de SQL Server.

4 L’authentification par Identité managée est prise en charge pour la connexion au stockage Blob Azure (ABS) et à ADLS Gen2. Il nécessite SQL Server activé par Azure Arc ou SQL Server sur une machine virtuelle Azure pour la gestion de SQL Server sur site. Il est disponible en mode natif sur Azure SQL Database et Azure SQL Managed Instance.

5 SQL Server 2019 CU11 et les versions ultérieures prennent en charge Azure Data Lake Storage Gen2 avec le préfixe abfs ou abfss. Dans SQL Server 2022 et les versions ultérieures, utilisez le adls préfixe.

  • Les tables externes sont prises en charge dans SQL Server 2019, SQL Server 2022, SQL Server 2025, Azure SQL Database, Azure SQL Managed Instance et la base de données SQL dans Microsoft Fabric.
  • OPENROWSET (BULK) est pris en charge dans SQL Server 2019, SQL Server 2022, SQL Server 2025, Azure SQL Database, Azure SQL Managed Instance et la base de données SQL dans Microsoft Fabric. SQL Server 2019 prend en charge les chemins de fichiers locaux et réseau, tandis que SQL Server 2022 et versions ultérieures prennent également en charge la lecture du stockage cloud avec FORMAT = 'PARQUET', FORMAT = DELTA, et FORMAT = 'CSV'.
  • L'exportation CETAS n'est pas prise en charge dans SQL Server 2019, Azure SQL Database, ni SQL Database dans Microsoft Fabric. L’exportation CETAS est prise en charge dans SQL Server 2022, SQL Server 2025 et Azure SQL Managed Instance.
  • Les fichiers CSV et délimités sont pris en charge dans SQL Server 2019, SQL Server 2022, SQL Server 2025, Azure SQL Database, Azure SQL Managed Instance et SQL Database dans Microsoft Fabric. SQL Server 2019 nécessite Hadoop pour la prise en charge du CSV, tandis que SQL Server 2022 et versions ultérieures prennent en charge le CSV nativement sans Hadoop.
  • Les fichiers Parquet ne sont pas pris en charge dans SQL Server 2019. Les fichiers Parquet sont pris en charge dans SQL Server 2022, SQL Server 2025, Azure SQL Database, Azure SQL Managed Instance et la base de données SQL dans Microsoft Fabric.
  • Les tables Delta Lake ne sont pas prises en charge dans SQL Server 2019, Azure SQL Database, Azure SQL Managed Instance, ni SQL Database dans Microsoft Fabric. Les tables Delta Lake sont prises en charge dans SQL Server 2022 et SQL Server 2025.
  • La connexion à une autre instance SQL Server est prise en charge dans SQL Server 2019, SQL Server 2022 et SQL Server 2025. La connexion à une autre instance SQL Server n'est pas prise en charge depuis Azure SQL Database, Azure SQL Managed Instance, ni la base de données SQL dans Microsoft Fabric.
  • La connexion à Azure SQL Database ou Azure SQL Managed Instance est prise en charge depuis SQL Server 2019, SQL Server 2022 et SQL Server 2025 via le connecteur SQL Server. Les informations d’identification délimitées à la base de données ciblent le point de terminaison d’Azure SQL Database ou d’Azure SQL Managed Instance, et les étapes de configuration sont les mêmes que pour établir une connexion à une autre instance de SQL Server. Ces connexions ne sont pas prises en charge par Azure SQL Database, Azure SQL Managed Instance, ou SQL Database dans Microsoft Fabric.
  • La connexion à Oracle, Teradata ou MongoDB est prise en charge depuis SQL Server 2019, SQL Server 2022 et SQL Server 2025. Ces connexions ne sont pas prises en charge par Azure SQL Database, Azure SQL Managed Instance, ou SQL Database dans Microsoft Fabric.
  • La connexion à Stockage Blob Azure est prise en charge par SQL Server 2019, SQL Server 2022, SQL Server 2025, Azure SQL Database et Azure SQL Managed Instance. La connexion à Stockage Blob Azure n'est pas prise en charge depuis la base de données SQL dans Microsoft Fabric.
  • La connexion à ADLS Gen2 n'est pas prise en charge dans les versions de SQL Server 2019 antérieures à CU11 ni depuis la base de données SQL dans Microsoft Fabric. La connexion à ADLS Gen2 est prise en charge à partir de SQL Server 2019 CU11, ainsi que dans SQL Server 2022, SQL Server 2025, Azure SQL Database et Azure SQL Managed Instance.
  • La connexion à un stockage compatible S3 n'est pas prise en charge par SQL Server 2019, Azure SQL Database, Azure SQL Managed Instance, ni base de données SQL dans Microsoft Fabric. La connexion au stockage compatible S3 est prise en charge depuis SQL Server 2022 et SQL Server 2025.
  • La connexion à OneLake est prise en charge depuis la base de données SQL dans Microsoft Fabric. La connexion à OneLake n'est pas prise en charge par SQL Server 2019, SQL Server 2022, SQL Server 2025, Azure SQL Database ou Azure SQL Managed Instance.
  • Le calcul par poussée est pris en charge dans SQL Server 2019, SQL Server 2022 et SQL Server 2025. Le calcul pushdown n’est pas pris en charge dans Azure SQL Database, ni dans Azure SQL Managed Instance, ni dans la base de données SQL dans Microsoft Fabric.
  • L'authentification par identité managée n'est pas prise en charge dans SQL Server 2019 ni SQL Server 2022. L’authentification par identité managée est prise en charge dans SQL Server 2025 pour les connexions à Stockage Blob Azure et ADLS Gen2, et nécessite SQL Server ou SQL Server compatibles Azure Arc sur une machine virtuelle Azure. L'authentification Managed Identity est également prise en charge dans Azure SQL Database et Azure SQL Managed Instance, mais elle n'est pas prise en charge dans la base de données SQL de Microsoft Fabric.

Note

À compter de SQL Server 2025 (17.x), l’interrogation de fichiers de données (CSV, Parquet et Delta) sur stockage Blob Azure, ADLS Gen2 ou S3 est une fonctionnalité de moteur native et ne nécessite plus l’installation ou l’exécution de services PolyBase. Les connecteurs SGBDR (SQL Server, Oracle, Teradata, MongoDB, ODBC) nécessitent toujours l’installation et l’exécution des services PolyBase. SQL Server 2025 (17.x) ajoute également la prise en charge linux de ces connecteurs, qui étaient précédemment disponibles sur Windows uniquement.

Interroger des données externes

Avant de choisir un scénario spécifique, comprenez les trois façons d’interroger des données externes :

Approche Syntaxe À utiliser lorsque Authentification Installation de PolyBase requise
Requêtes ad hoc OLE DB OPENROWSET(provider, connection, query) Vous souhaitez une requête ponctuelle rapide sans objets persistants ou vous avez besoin de l’authentification Microsoft Entra ID Authentification SQL, authentification Windows, Microsoft Entra ID (MSOLEDBSQL) Non
Requêtes ad hoc sur les fichiers OPENROWSET(BULK ...) Vous souhaitez explorer rapidement ou tester des schémas de fichiers avant de créer une table Jeton SAP, clé d’accès, Identité managée, ID Microsoft Entra SQL Server 2022 : Oui 1

SQL Server 2025 et versions ultérieures : Non

Azure SQL Database, Azure SQL Managed Instance, et SQL Database dans Fabric : intégré
Connecteurs de données persistantes CREATE EXTERNAL TABLE avec sqlserver://, oracle://, teradata://, etc. Vous avez besoin d’un accès récurrent, d’une gouvernance, d’une statistique et d’un calcul pushdown pour la production Authentification SQL uniquement Oui

1 Pour l'accès aux fichiers cloud dans SQL Server 2022 (16.x), vous devez installer la fonctionnalité PolyBase, mais les connecteurs de stockage compatibles Stockage Blob Azure, ADLS Gen2 et S3 ne dépendent pas des services PolyBase. SQL Server 2025 (17.x) et versions ultérieures offrent un support natif pour CSV, Parquet et Delta sans installer ni exécuter les services PolyBase.

  • Les requêtes ad hoc OLE DB permettent OPENROWSET(provider, connection, query) un accès rapide et unique à une source de données distante sans créer d’objets persistants. Ils peuvent utiliser l’authentification SQL, l’authentification Windows Authentication ou Microsoft Entra ID avec MSOLEDBSQL. Ce scénario ne nécessite pas d’installation de PolyBase.
  • Les requêtes ad hoc sur des fichiers servent OPENROWSET(BULK ...) à explorer rapidement les données de fichiers ou à tester un schéma avant de créer une table. Ils peuvent utiliser des jetons SAS, des clés d’accès, une identité gérée ou Microsoft Entra ID. SQL Server 2022 nécessite l'installation de la fonctionnalité PolyBase pour les fichiers cloud, mais il ne nécessite pas les services PolyBase. SQL Server 2025 et les versions ultérieures ne nécessitent pas PolyBase pour les fichiers cloud. Les requêtes ad hoc de fichier sont intégrées à Azure SQL Database, Azure SQL Managed Instance et SQL Database dans Fabric.
  • Les connecteurs de données persistants utilisent CREATE EXTERNAL TABLE avec sqlserver://, oracle://, teradata://, et des emplacements similaires pour l’accès récurrent, la gouvernance, les statistiques et le calcul par poussée dans les charges de travail en production. Ils nécessitent une authentification SQL et des services PolyBase.

Guide de décision

Scénario Recommandation
Vous avez besoin d’une authentification Microsoft Entra ID pour le SQL distant, ou vous voulez éviter les services PolyBase. À utiliser OPENROWSET(MSOLEDBSQL, ...) (ad hoc, sans objets persistants).
Vous avez besoin de tables persistantes, de statistiques ou de calculs en poussée vers des bases de données distantes. Utiliser CREATE EXTERNAL TABLE avec des connecteurs PolyBase (sqlserver://, , oracle://teradata://, mongodb://, odbc://). OPENROWSET Il ne supporte pas les connecteurs.
Vous explorez un nouveau fichier ou testez un schéma. Utilisation OPENROWSET(BULK ...) (itération rapide, pas d’objets persistants).
Vous ingérez des données de fichiers dans une table avec des transformations. Utiliser INSERT ... SELECT à partir de OPENROWSET(BULK ...).
Vous avez besoin de gouvernance ou d’accès partagé pour de nombreux utilisateurs ou applications. Utilisez CREATE EXTERNAL TABLE pour que les permissions et les métadonnées soient centralisées.
Vous travaillez sur une base de données SQL dans Fabric. À utiliser OPENROWSET(BULK ...) pour des requêtes OneLake ad hoc ou des tables externes pour un accès réutilisable ; pour le stockage externe, utiliser les raccourcis OneLake.
  • Si vous avez besoin d’une authentification Microsoft Entra ID pour SQL distant ou souhaitez éviter les services PolyBase, utilisez OPENROWSET(MSOLEDBSQL, ...) les requêtes distantes ad hoc sans objets persistants.
  • Si vous avez besoin de tables persistantes, de statistiques ou de calculs en poussée vers des bases de données distantes, utilisez CREATE EXTERNAL TABLE avec PolyBase des connecteurs tels que sqlserver://, oracle://, teradata://, mongodb://, et odbc://. OPENROWSET ne prend pas en charge ces connecteurs.
  • Si vous explorez un nouveau fichier ou testez un schéma, utilisez OPENROWSET(BULK ...) pour itération rapide et sans objets persistants.
  • Si vous ingérez des données de fichier dans une table avec des transformations, utilisez INSERT ... SELECT à partir de OPENROWSET(BULK ...).
  • Si vous avez besoin de gouvernance ou d’accès partagé pour de nombreux utilisateurs ou applications, utilisez CREATE EXTERNAL TABLE ainsi que les permissions et les métadonnées sont centralisés.
  • Si vous travaillez dans une base de données SQL dans Fabric, utilisez OPENROWSET(BULK ...) des requêtes OneLake ad hoc ou des tables externes pour un accès réutilisable, et utilisez des raccourcis OneLake pour le stockage externe.

Choisir votre scénario

Maintenant que vous comprenez les trois approches, utilisez l’un des guides suivants pour implémenter votre cas d’usage spécifique.

Fichiers de requête (Parquet, CSV ou Delta)

Si vos données se trouvent dans des fichiers Parquet, CSV ou Delta sur stockage Blob Azure, ADLS Gen2, stockage compatible S3 ou OneLake, suivez l’un des guides suivants :

Scénario Guide recommandé Platforms
Requête ad hoc rapide sur un fichier Parquet ou CSV Utilisez OPENROWSET. Aucune table externe n’est nécessaire SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Fabric
Requêtes répétées sur des fichiers Parquet avec un schéma persistant Créer une table externe avec Parquet SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Fabric
Interroger des fichiers CSV avec une table externe Créer une table externe avec un format de fichier pour le texte délimité SQL Server 2019 (15.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Fabric
Interroger des tables Delta Lake Créer une table externe avec FILE_FORMAT = DeltaLakeFileFormat SQL Server 2022 (16.x) et versions ultérieures
Exporter les résultats des requêtes vers des fichiers Parquet ou CSV (CETAS) Utilisez CREATE EXTERNAL TABLE AS SELECT. SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Managed Instance
  • Pour une requête rapide et ad hoc sur un fichier Parquet ou CSV, utilisez OPENROWSET. Cette méthode ne nécessite pas de table externe. SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance et SQL database in Fabric supportent ce schéma.
  • Pour les requêtes répétées sur des fichiers Parquet avec un schéma persistant, utilisez une table externe sur Parquet. SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance et SQL database in Fabric supportent ce schéma.
  • Pour une requête sur des fichiers CSV, utilisez une table externe avec un format de fichier pour le texte délimité. SQL Server 2019 (15.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance et SQL database in Fabric supportent ce schéma.
  • Pour une requête sur les tables Delta Lake, utilisez une table externe avec FILE_FORMAT = DeltaLakeFileFormat. SQL Server 2022 (16.x) et les versions ultérieures prennent en charge ce schéma.
  • Pour exporter les résultats de requête vers des fichiers Parquet ou CSV, utilisez CREATE EXTERNAL TABLE AS SELECT. SQL Server 2022 (16.x) et les versions ultérieures ainsi que Azure SQL Managed Instance prennent en charge ce schéma.

Vous pouvez également suivre l’un des didacticiels pas à pas suivants :

Tutoriel Description
Démarrer avec PolyBase dans SQL Server 2022 Couvre OPENROWSET avec Parquet et CSV, les tables externes et la navigation dans les dossiers.
Virtualiser un fichier Parquet dans un stockage d’objets compatible S3 avec PolyBase Tutoriel pour SQL Server 2022 (16.x) et versions ultérieures.
Virtualiser un fichier CSV avec PolyBase Tutoriel pour SQL Server 2022 (16.x) et versions ultérieures.
Virtualiser une table delta avec PolyBase Tutoriel pour SQL Server 2022 (16.x) et versions ultérieures.
Virtualisation des données avec Azure SQL Database (préversion) Guide Azure SQL Database pour Parquet et CSV.
Virtualisation des données avec Azure SQL Managed Instance Guide Azure SQL Managed Instance pour Parquet, CSV et CETAS.
Virtualisation des données dans une base de données SQL dans Fabric Base de données SQL dans Fabric guide pour les fichiers OneLake.

Se connecter à une autre instance SQL Server, Azure SQL Database ou SQL Managed Instance

Dans SQL Server 2019 (15.x) et versions ultérieures, PolyBase peut interroger des tables dans une autre instance SQL Server, Azure SQL Database ou Azure SQL Managed Instance, sans utiliser de serveurs liés.

Important

Le sqlserver:// connecteur n’est pas pris en charge dans la base de données SQL dans Fabric. Les connecteurs SGBDR PolyBase utilisent l’authentification SQL via CREATE DATABASE SCOPED CREDENTIAL et ne prennent pas en charge l’authentification Microsoft Entra ID, Managed Identity ou service principal. Étant donné que la base de données SQL dans Fabric nécessite l’authentification Microsoft Entra, vous ne pouvez pas vous y connecter à l’aide de PolyBase.

Étape Procédure à suivre
1. Installer PolyBase Installer PolyBase sur Windows ou installer PolyBase sur Linux
2. Créer un identifiant CREATE DATABASE SCOPED CREDENTIAL avec la connexion cible
3. Créer une source de données externe CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')
4. Créer une table externe CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')
5. Requête SELECT * FROM <external_table>
    1. Installez PolyBase sur Windows ou Linux en utilisant Installer PolyBase sur Windows ou installez PolyBase sur Linux avant de configurer l’accès aux données SQL externes.
    1. Créez des informations d’identification limitées à la base de données pour la connexion cible en utilisant CREATE DATABASE SCOPED CREDENTIAL afin que le moteur puisse s’authentifier auprès du serveur distant.
    1. Créez une source de données externe pour le SQL Server distant en utilisant CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>').
    1. Créez une table externe en utilisant CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>') pour représenter la table distante.
    1. Interrogez la table externe en utilisant SELECT * FROM <external_table>.

Conseil / Astuce

Le connecteur SQL Server (sqlserver://) fonctionne également pour Azure SQL Database et Azure SQL Managed Instance. Utilisez les mêmes étapes et définissez LOCATION sur le point de terminaison Azure SQL Database ou Azure SQL Managed Instance (par exemple, sqlserver://myserver.database.windows.net).

Pour obtenir un guide détaillé, consultez Configurer PolyBase pour accéder aux données externes dans SQL Server.

Se connecter à Oracle, Teradata ou MongoDB

SQL Server 2019 (15.x) et versions ultérieures peuvent interroger Oracle, Teradata, MongoDB et Cosmos DB via des connecteurs ODBC PolyBase.

Source de données Guide Exigences
Oracle Configurer PolyBase pour accéder à des données externes dans Oracle SQL Server 2019 (15.x) et versions ultérieures, pilotes clients Oracle
Teradata Configurer PolyBase pour accéder à des données externes dans Teradata SQL Server 2019 (15.x) et versions ultérieures, pilote ODBC Teradata
MongoDB / Cosmos DB Configurer PolyBase pour accéder à des données externes dans MongoDB SQL Server 2019 (15.x) et versions ultérieures, pilote ODBC MongoDB
N’importe quelle source ODBC Configurer PolyBase pour accéder à des données externes avec des types génériques ODBC SQL Server 2019 (15.x) et versions ultérieures (Windows)

(Linux commençant par SQL Server 2025 (17.x))

Se connecter à Stockage Blob Azure ou à Azure Data Lake Storage Gen2

Plateforme SQL Options d’authentification Guide
SQL Server 2022 (16.x) et versions ultérieures Jeton SAS, clé d’accès, Identité managée (à compter de SQL Server 2025 (17.x)) Configurer PolyBase pour accéder aux données externes dans Stockage Blob Azure
SQL Server 2019 (15.x) Clé d’accès (via le connecteur Hadoop) Configurer PolyBase pour accéder aux données externes dans Stockage Blob Azure
Azure SQL Database Jeton SAP, Identité managée, Microsoft Entra pass-through Virtualisation des données avec Azure SQL Database (préversion)
Azure SQL Managed Instance (Instance gérée Azure SQL) Jeton SAP, Identité managée Virtualisation des données avec Azure SQL Managed Instance

Dans SQL Server 2022 (16.x), les préfixes d’URI ont changé. Lors de la migration à partir de SQL Server 2019 (15.x) ou des versions antérieures :

  • Stockage Blob Azure : définir wasb[s]:// sur abs://
  • ADLS Gen2 : Passer abfs[s]:// à adls://

Pour plus d’informations, consultez Configurer PolyBase pour accéder aux données externes dans Stockage Blob Azure.

Se connecter au stockage d’objets compatible avec S3

SQL Server 2022 (16.x) et versions ultérieures prennent en charge le stockage compatible S3, tel qu’Amazon S3, MinIO et Ceph.

Pour plus d’informations, consultez Configurer PolyBase pour accéder aux données externes dans le stockage d’objets compatible S3.

Exporter des données avec CREATE EXTERNAL TABLE AS SELECT (CETAS)

CETAS exporte les résultats des requêtes vers des fichiers externes (Parquet ou CSV) dans stockage Blob Azure, ADLS Gen2 ou stockage compatible S3.

Plateforme SQL Soutenu Formats d’exportation Remarques
SQL Server 2022 (16.x) et versions ultérieures. L’exportation vers ADLS Gen2 avec CETAS nécessite SQL Server 2022 CU5 ou version ultérieure. Oui Parquet, CSV Nécessite une configuration serveur : autoriser l’exportation de polybase.
Azure SQL Managed Instance (Instance gérée Azure SQL) Oui Parquet, CSV Désactivé par défaut
Azure SQL Database Non Aucun Non disponible
Base de données SQL dans Fabric Non Aucun Non disponible
  • SQL Server 2022 et versions ultérieures prennent en charge CETAS et exportent des fichiers Parquet et CSV. Le paramètre Configuration du serveur : autoriser l’exportation PolyBase est requis. L'exportation CETAS vers ADLS Gen2 n'est pas disponible dans les versions de SQL Server 2022 avant CU5.
  • Azure SQL Managed Instance prend en charge CETAS et exporte des fichiers Parquet et CSV. La directive Désactivé par défaut décrit son état par défaut.
  • Azure SQL Database ne prend pas en charge CETAS.
  • La base de données SQL dans Fabric ne prend pas en charge CETAS.

Pour obtenir la référence Transact-SQL, consultez CREATE EXTERNAL TABLE AS SELECT (CETAS).

Exemples de démarrage rapide

Exemple 1 : Requête ad hoc sur un fichier Parquet (OPENROWSET)

Aucune table externe n’est nécessaire. Fonctionne sur SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance et SQL Database dans Fabric.

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

Exemple 2 : Table externe de données en format CSV dans le Stockage Blob Azure

Cet exemple fonctionne sur toutes les plateformes SQL qui prennent en charge des tables externes sur des fichiers CSV.

  • Étape 1 : Créer une clé principale de base de données (DMK). Cette étape est requise, car les informations d’identification stockent le secret d'un jeton SAS. Cependant, vous pouvez sauter cette étape si vous utilisez l’identité gérée ou l’authentification Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
    
  • Étape 2 : Créer des informations d’identification avec un jeton SAP. Omettez le premier ?.

    CREATE DATABASE SCOPED CREDENTIAL MyStorageCred
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
         SECRET = '<your_SAS_token>'; -- omit the leading '?'
    
  • Étape 3 : Créer une source de données externe.

    CREATE EXTERNAL DATA SOURCE MyAzureStorage
    WITH (
        LOCATION = 'abs://mycontainer@mystorageaccount.blob.core.windows.net',
        CREDENTIAL = MyStorageCred
    );
    
  • Étape 4 : Créer un format de fichier pour le fichier CSV.

    CREATE EXTERNAL FILE FORMAT CsvFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (
            FIELD_TERMINATOR = ',',
            STRING_DELIMITER = '"',
            FIRST_ROW = 2
        )
    );
    
  • Étape 5 : Créer la table externe.

    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
    );
    
  • Étape 6 : Interroger la table externe.

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

Exemple 3 : Interroger une table dans un autre serveur SQL Server

Cet exemple fonctionne sur SQL Server 2019 (15.x) et les versions ultérieures.

  • Étape 1 : Créez une clé principale de base de données (obligatoire, car les informations d’identification stockent un mot de passe).

    CREATE MASTER KEY ENCRYPTION
    BY PASSWORD = '<password>';
    
  • Étape 2 : Créez des informations d’identification pour l’instance SQL Server distante.

    CREATE DATABASE SCOPED CREDENTIAL RemoteSqlCred
    WITH IDENTITY = 'remote_user',
         SECRET = '<password>';
    
  • Étape 3 : Créer la source de données externe.

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • Étape 4 : Créer la table externe (nom en trois parties dans 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'
    );
    
  • Étape 5 : Interroger sur plusieurs serveurs.

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

Exemple 4 : Exporter des résultats vers Parquet avec CETAS

Fonctionne sur SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Managed Instance.

  • Étape 1 : Activer CETAS (SQL Server uniquement).

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • Étape 2 : Créer des informations d’identification et une source de données (réutilisation à partir d’exemples précédents).

  • Étape 3 : créer un format de fichier pour l’exportation Parquet.

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • Étape 4 : Exporter les résultats de la requête.

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

Blocs de construction T-SQL pour PolyBase

Avant d’implémenter un scénario, comprenez les objets T-SQL principaux que PolyBase utilise et comment ils s’intègrent :

Diagramme montrant les objets Transact-SQL PolyBase et leurs relations.

Schéma illustrant les objets T-SQL de PolyBase et leurs relations, depuis l’authentification (clé principale de la base de données, informations d’identification) jusqu’aux méthodes d’interrogation (table externe, OPENROWSET, BULK INSERT, CETAS), en passant par les sources de données et les formats de fichiers.

Pour obtenir une référence complète Transact-SQL pour tous les objets, consultez la référence Transact-SQL PolyBase.

Important

Vérifiez le mappage de type de données pour votre format de fichier externe. Lorsque vous créez un format de fichier externe ou interrogez des fichiers à l’aide OPENROWSETde , PolyBase mappe automatiquement les types de données sources (Parquet, CSV, Delta, Oracle, Teradata, MongoDB) aux types de données SQL Server. Les types incompatibles peuvent entraîner une troncation silencieuse, une perte de précision ou des erreurs de requête. Par exemple, un Parquet DECIMAL(38,18) se mappe à DECIMAL(18,0). Passez en revue les tables de mappage avant de définir des colonnes de table externes ou une WITH clause. Pour obtenir la référence complète, consultez Mappage de type avec PolyBase.

Quand avez-vous besoin de CREATE MASTER KEY ?

Une clé principale de base de données (DMK) est créée à l’aide CREATE MASTER KEY de la syntaxe. Le DMK chiffre les secrets stockés dans les identifiants de portée de base de données. Elle n’est requise que lorsque les informations d’identification contiennent une valeur secrète, c’est-à-dire lorsqu’elle stocke un mot de passe, un jeton ou une clé d’accès.

  • Le DMK est requis (les identifiants contiennent un secret) :

    Type d’authentification Valeur IDENTITY Possède un secret DMK
    Jeton SAS 'SHARED ACCESS SIGNATURE' Oui Obligatoire
    Clé d'accès S3 'S3 ACCESS KEY' Oui Obligatoire
    Connexion SQL / authentification de base '<username>' Oui Obligatoire
    Clé d’accès au compte de stockage '<storage_account_name>' Oui Obligatoire
    • Un identifiant de jeton SAS utilise IDENTITY = 'SHARED ACCESS SIGNATURE' et stocke une valeur secrète, il nécessite donc une clé maîtresse de base de données.
    • Un identifiant de clé d’accès S3 utilise IDENTITY = 'S3 ACCESS KEY' et stocke une valeur secrète, il nécessite donc une clé maîtresse de base de données.
      • Un identifiant de connexion SQL ou d’authentification de base utilise IDENTITY = '<username>' et stocke une valeur secrète, il nécessite donc une clé maîtresse de base de données.
    • Un identifiant de clé d’accès à un compte de stockage utilise IDENTITY = '<storage_account_name>' et stocke une valeur secrète, il nécessite donc une clé maîtresse de base de données.
  • Le DMK n’est pas obligatoire (aucun secret stocké) :

    Type d’authentification Valeur IDENTITY Possède un secret DMK
    Identité gérée 'Managed Identity' Non Non requis
    Microsoft Entra ID (système d'identification de Microsoft) 'User Identity' ou 'Managed Identity' Non Non requis
    • Un identifiant géré n’utilise IDENTITY = 'Managed Identity' ni ne stocke aucun secret, il ne nécessite donc pas de clé maîtresse de base de données.
    • Un identifiant Microsoft Entra ID n'utilise IDENTITY = 'User Identity' ni IDENTITY = 'Managed Identity' ne stocke aucun secret, donc il ne nécessite pas de clé maîtresse de base de données.

Conseil / Astuce

Si votre CREATE DATABASE SCOPED CREDENTIAL déclaration ne contient pas de secret, vous n’avez pas besoin d’un DMK. Identité managée et authentification Microsoft Entra ID délèguent la confiance à la plateforme. La base de données ne stocke pas les mots de passe ou les jetons.

Exemples :

Dans cet exemple de requête, le DMK est requis (Les informations d’identification stockent un jeton SAP).

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

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

Dans cet exemple de requête, le DMK n’est pas obligatoire (Identité managée, aucun secret).

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

Dans cet exemple de requête, le DMK n’est pas obligatoire (pass-through Microsoft Entra, aucun secret).

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

Accès aux données à distance avec OPENROWSET et tables externes

SQL Server offre trois approches distinctes pour interroger des données distantes. Vous pouvez choisir la bonne approche lorsque vous comprenez les différences de syntaxe, d’authentification et d’architecture.

Approche Syntaxe Se connecte au Authentification Services PolyBase Platforms
Requêtes OLE DB OPENROWSET(provider, connection, query) Toute source OLE DB via MSOLEDBSQL, SQLOLEDB ou d’autres fournisseurs Authentification SQL, authentification Windows, Microsoft Entra ID (MSOLEDBSQL) Non SQL Server (toutes les versions prises en charge)
Requêtes de fichiers dans SQL Server 2022 (16.x) et SQL Server 2019 (15.x) OPENROWSET(BULK ...) Fichiers sur un disque local, un réseau ou un cloud (Blob Azure, ADLS, S3, OneLake) Jeton SAP, clé d’accès, Identité managée, ID Microsoft Entra Oui pour le cloud 1 ; Non pour le local SQL Server 2022 (16.x) et SQL Server 2019 (15.x)
Requêtes de fichiers dans SQL Server 2025 (17.x) et versions ultérieures OPENROWSET(BULK ...) Fichiers sur un disque local, un réseau ou un cloud (Blob Azure, ADLS, S3, OneLake) Jeton SAP, clé d’accès, Identité managée, ID Microsoft Entra Non SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Fabric
Connecteurs PolyBase CREATE EXTERNAL TABLE avec CREATE EXTERNAL DATA SOURCE l’utilisation de sqlserver://, oracle://, teradata://, mongodb://, odbc:// Serveur SQL distant, Oracle, Teradata, MongoDB, sources ODBC Authentification SQL uniquement Oui SQL Server 2019 (15.x) et versions ultérieures (Windows) ; SQL Server 2025 (17.x) et versions ultérieures (Linux)

1 Pour l’accès aux fichiers cloud dans SQL Server 2022 (16.x), la fonctionnalité PolyBase doit être installée.

  • Les requêtes OLE DB utilisent OPENROWSET(provider, connection, query) pour se connecter à n’importe quelle source OLE DB via MSOLEDBSQL, SQLOLEDB ou un autre fournisseur sur toutes les versions prises en charge de SQL Server. Ils supportent l'authentification SQL, l'authentification Windows Authentication et Microsoft Entra ID avec MSOLEDBSQL, et ils ne nécessitent pas l'installation de services PolyBase.
  • Les requêtes de fichiers servent OPENROWSET(BULK ...) à lire des fichiers sur disque local, partages réseau ou stockage cloud tels que Stockage Blob Azure, ADLS, S3 ou OneLake en utilisant un jeton SAS, une clé d’accès, une identité managée ou un Microsoft Entra ID. Ils sont pris en charge pour les fichiers locaux et réseau dans SQL Server 2005 et versions ultérieures, pour les fichiers cloud dans SQL Server 2022 (16.x) et versions ultérieures, ainsi que dans Azure SQL Database, Azure SQL Managed Instance et SQL Database dans Fabric. Les requêtes de fichiers ne nécessitent pas de services PolyBase pour les fichiers locaux ou pour les fichiers cloud dans SQL Server 2022 (16.x) et versions ultérieures.
  • Les connecteurs PolyBase utilisent CREATE EXTERNAL TABLE avec CREATE EXTERNAL DATA SOURCE et l’emplacement sqlserver://, oracle://, teradata://, mongodb:// ou odbc:// pour se connecter à des sources de données distantes SQL Server, Oracle, Teradata, MongoDB ou ODBC. Ils nécessitent l’authentification SQL et les services PolyBase dans SQL Server 2019 (15.x) et versions ultérieures sur Windows et SQL Server 2025 (17.x) et versions ultérieures sous Linux. Pour plus d’informations, consultez CREATE EXTERNAL DATA SOURCE (Transact-SQL).

Quand utiliser chaque approche

Utilisez OLE DB OPENROWSET pour :

  • Utilisez OLE DB OPENROWSET pour des requêtes rapides et ponctuelles sans créer d’objets persistants.
  • Utilisez OLE DB OPENROWSET pour l’authentification Microsoft Entra ID ou Managed Identity via MSOLEDBSQL.
  • Utilisez OLE DB OPENROWSET pour éviter les dépendances de services PolyBase.
  • Utilisez OLE DB OPENROWSET pour vous connecter à toute source de données qui possède un fournisseur OLE DB.

Utilisez le fichier OPENROWSET(BULK) pour :

  • Utilisez le fichier OPENROWSET(BULK ...) pour l’exploration de fichiers ad hoc et la découverte de schéma.
  • Utilisez fichier OPENROWSET(BULK ...) pour des transformations rapides et des aperçus avant de vous engager dans une définition de tableau.
  • Utilisez le fichier OPENROWSET(BULK ...) pour des transformations flexibles de colonnes en ligne telles que le casting, le filtrage et les colonnes calculées.
  • Utilisez un fichier OPENROWSET(BULK ...) pour des données qui ne changent pas fréquemment et qui n’ont pas besoin de métadonnées persistantes.

Utilisez les connecteurs PolyBase avec CREATE EXTERNAL TABLE pour :

  • Utilisez des connecteurs PolyBase avec CREATE EXTERNAL TABLE pour des définitions de tables persistantes et réutilisables auxquelles plusieurs utilisateurs ou applications peuvent accéder.
  • Utilisez les connecteurs PolyBase avec CREATE EXTERNAL TABLE pour les charges de travail de production qui nécessitent des statistiques et l’optimisation des plans de requête.
  • Utilisez des connecteurs PolyBase avec CREATE EXTERNAL TABLE pour le calcul délégué sur des sources distantes telles qu’Oracle et SQL Server.
  • Utilisez des connecteurs PolyBase avec CREATE EXTERNAL TABLE pour une gouvernance et une sécurité partagées ; une fois la table créée, les utilisateurs n’ont besoin que de l’autorisation SELECT.
  • Utilisez les connecteurs PolyBase avec CREATE EXTERNAL TABLE lorsqu’une authentification SQL est possible sur la source distante.

OPENROWSET (OLE DB) - requêtes distantes ad hoc (aucun service PolyBase n’est requis)

La forme OLE DB de OPENROWSET se connecte à une source de données distante via un fournisseur OLE DB, exécute une requête directe et retourne les résultats sous forme d’ensemble de lignes. Il s’agit d’une alternative ponctuelle et ad hoc à un serveur lié. Aucune métadonnées persistantes ne sont créées. Cette syntaxe ne nécessite pas de services PolyBase et ne prend pas en charge les fichiers cloud ou les sources de données externes.

Cet exemple de requête se connecte à un serveur SQL Server distant via OLE DB (et non PolyBase).

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

OPENROWSET(BULK) - Requêtes basées sur des fichiers (PolyBase)

La forme BULK de OPENROWSET lit les données directement depuis les fichiers. Sur SQL Server 2019 (15.x) et les versions antérieures, il lit à partir des chemins de fichier local ou UNC et nécessite un fichier de format. Dans SQL Server 2022 (16.x) et versions ultérieures, vous pouvez lire à partir du stockage cloud en utilisant les paramètres DATA_SOURCE et FORMAT. Cette approche est la version intégrée à PolyBase utilisée pour la virtualisation des données.

Dans le contexte de PolyBase et de la virtualisation des données, lorsque ce guide fait référence à OPENROWSET, cela désigne la syntaxe OPENROWSET(BULK ...) avec une clause FORMAT pour interroger des fichiers externes.

Exemples :

Cet exemple de requête lit un fichier Parquet à partir d'Stockage Blob Azure (SQL Server 2022 et versions ultérieures).

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

Cet exemple de requête lit un fichier Parquet avec un chemin d’accès en ligne (Azure SQL Database, Azure SQL Managed Instance).

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

Quand utiliser OPENROWSET et les tables externes

Les deux, OPENROWSET(BULK ...) et les tables externes, vous permettent d’interroger des données externes avec T-SQL, mais ils sont conçus pour différents cas d’usage. Le tableau suivant récapitule les principales différences pour vous aider à décider quelle approche correspond à votre scénario.

Capacité OPENROWSET(BULK ...) Table externe
Purpose Exploration ad hoc et requêtes ponctuelles Définition de table persistante et réutilisable
Métadonnées stockées dans la base de données Non. Rien n’est enregistré après l’exécution de la requête Yes. La définition de table, la source de données et le format de fichier sont stockées en tant qu’objets de base de données
Définition de schéma Déduit automatiquement à partir du fichier (Parquet) ou spécifié directement avec la clause WITH Défini explicitement dans l’instruction CREATE EXTERNAL TABLE
Permissions Nécessite ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS Une fois créée, l’autorisation standard SELECT sur la table est suffisante
Colonnes calculées Yes. Ajoutez des expressions et des colonnes calculées dans la SELECT liste ; les fonctions de métadonnées comme filename() et filepath() sont disponibles uniquement ici. Non. Liste de colonnes fixe ; effectuer des transformations dans une vue ou dans la requête qui lit la table externe
Statistiques Azure SQL Managed Instance : statistiques manuelles à colonne unique via sys.sp_create_openrowset_statistics. Consultez les statistiques manuelles OPENROWSET.

SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database, SQL database in Fabric : création automatique de statistiques sur les prédicats. Les statistiques manuelles OPENROWSET ne sont pas prises en charge sur SQL Server.
Prise en charge complète CREATE STATISTICS sur toutes les plateformes, avec fonction de création automatique dans SQL Server 2022 (16.x) et versions ultérieures. Référez-vous à Créer des statistiques manuelles pour une table externe.
Pushdown Prise en charge limitée. Le moteur peut envoyer des filtres vers l’analyse du fichier, mais il n’y a pas de pushdown vers des sources SGBDR distantes Yes. Prend en charge le calcul pushdown pour les connecteurs SGBDR (SQL Server, Oracle, Teradata, MongoDB)
Idéal pour Exploration des données, découverte de schémas, requêtes de prototypage, chargements de données ponctuelles, transformations flexibles Charges de travail de production, requêtes répétées, accès partagé entre les utilisateurs, tableaux de bord et rapports
  • OPENROWSET(BULK ...) est idéal pour l’exploration ad hoc et les requêtes ponctuelles, tandis qu’une table externe est meilleure pour des définitions de tables persistantes et réutilisables.
  • OPENROWSET(BULK ...) ne stocke pas les métadonnées dans la base de données après l’exécution de la requête, tandis qu’une table externe stocke la définition de la table, la source de données et le format de fichier sous forme d’objets de base de données.
  • OPENROWSET(BULK ...) déduit automatiquement le schéma à partir d’un fichier Parquet ou définit le schéma en ligne avec une WITH clause, tandis qu’une table externe définit explicitement le schéma dans l’énoncé CREATE EXTERNAL TABLE .
  • OPENROWSET(BULK ...) nécessite ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, tandis qu’une table externe peut être interrogée par des utilisateurs qui n’ont besoin que d’une autorisation standard SELECT une fois la table existante.
  • OPENROWSET(BULK ...) prend en compte les colonnes calculées dans les fonctions de requête et de métadonnées comme filename() et filepath(), tandis qu’une table externe possède une liste de colonnes fixe et nécessite des transformations dans une vue ou dans la requête qui lit la table externe.
  • OPENROWSET(BULK ...)dispose d’un support limité des statistiques : Azure SQL Managed Instance peut être utilisé sys.sp_create_openrowset_statistics pour des statistiques à colonne unique, mais SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database et SQL Database dans Fabric créent automatiquement des statistiques sur les prédicats. Les statistiques manuelles OPENROWSET ne sont pas prises en charge sur SQL Server, Azure SQL Database et SQL Database dans Fabric. Une table externe offre une prise en charge complète de CREATE STATISTICS sur toutes les plateformes, ainsi que des statistiques automatiques dans SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database et la base de données SQL dans Fabric. Voir les statistiques créées manuellement pour OPENROWSET et Créer des statistiques créées manuellement pour une table externe.
  • OPENROWSET(BULK ...) offre des capacités limitées de pushdown et n’autorise aucun pushdown vers des sources RDBMS distantes, tandis qu’une table externe prend en charge l’exécution des calculs par pushdown pour les connecteurs RDBMS.
  • OPENROWSET(BULK ...) est idéal pour l’exploration de données, la découverte de schémas, le prototypage, les charges uniques et les transformations flexibles, tandis qu’une table externe est idéale pour les charges de travail, les requêtes répétées, l’accès partagé, les tableaux de bord et les rapports.

Utiliser OPENROWSET quand vous avez besoin de flexibilité

Permet OPENROWSET d’explorer un fichier, de tester différents schémas ou d’ajouter des colonnes et des transformations calculées sans créer d’objets persistants. Par exemple, vous pouvez extraire le chemin d’accès du fichier en tant que colonne, convertir des types de données en ligne ou filtrer sur des expressions calculées dans une seule requête.

Cet exemple de requête inclut des colonnes calculées et des transformations :

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

Conseil / Astuce

Les fonctions filepath() et filename() sont disponibles dans Azure SQL Database, Azure SQL Managed Instance et SQL Server 2022 (16.x) et versions ultérieures. Ils vous permettent de filtrer des parties du chemin d’accès du fichier (élimination de partition) et d’exposer le nom de fichier source sous forme de colonne, ce qui n’est pas directement possible avec les tables externes.

Utiliser des tables externes lorsque vous avez besoin de persistance et de gouvernance

Utilisez des tables externes lorsque plusieurs utilisateurs ou applications doivent interroger les mêmes données externes à plusieurs reprises. Vous définissez le schéma, la source de données et les informations d’identification une fois et les stockez dans la base de données. Les consommateurs ont seulement besoin d’une autorisation SELECT sur la table.

Les tables externes prennent également en charge les statistiques que l’optimiseur de requête utilise pour générer de meilleurs plans d’exécution. Vous pouvez créer manuellement des statistiques ou laisser le moteur les créer automatiquement (SQL Server 2022 (16.x) et versions ultérieures).

Cet exemple de requête crée des statistiques sur une table externe pour de meilleurs plans de requête.

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

Pour plus d’informations sur les statistiques des deux approches, consultez les considérations relatives aux performances de PolyBase - Statistiques.

BULK INSERT vs. OPENROWSET(BULK) : Qu’est-ce que je dois utiliser ?

À la fois BULK INSERT et OPENROWSET(BULK ...) importez des données à partir de fichiers dans SQL Server à l’aide du même moteur de chargement en bloc sous-jacent. Toutefois, ils diffèrent de la syntaxe, de la flexibilité et de ce que vous pouvez faire avec les résultats. Le tableau suivant résume les principales différences :

Note

L'instruction autonome BULK INSERT n'est pas prise en charge dans la base de données SQL dans Fabric. Pour ingérer des données, utilisez INSERT ... SELECT avec OPENROWSET(BULK ...) contre OneLake.

Capacité BULK INSERT OPENROWSET(BULK ...)
Objectif de base Charge des données à partir d’un fichier directement dans une table cible Renvoie un ensemble de lignes que vous utilisez dans une SELECT ou INSERT ... SELECT instruction
Modèle d’utilisation Déclaration autonome : BULK INSERT <table> FROM '<file>' Doit être utilisé à l’intérieur d’une requête : SELECT * FROM OPENROWSET(BULK ...) ou INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)
Nécessite une table cible ? Yes. Écrit toujours directement dans une table Non. Vous pouvez SELECT à partir de celui-ci sans insérer n’importe où, ou insérer dans une table ou une table temporaire
Transformations de colonne pendant le chargement Prise en charge limitée. Les données circulent d’un fichier vers une table en l'état (mappage contrôlé par fichier de format ou ordre de colonne) Prise en charge complète. Vous pouvez ajouter des expressions, des CASTWHERE filtres, JOIN d’autres tables et des colonnes calculées dans l’environnementSELECT
Indicateurs de table La WITH clause inclut la prise en charge de BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK, et bien plus encore Prend en charge les indices de table via la syntaxe INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...)
Importation à valeur unique d’objets volumineux (LOB) Non pris en charge Yes. Prend en charge SINGLE_BLOB, SINGLE_CLOBSINGLE_NCLOB pour importer un fichier entier en tant que valeur varbinary(max), varchar(max)ou nvarchar(max)
Mettre en forme des fichiers Yes. Pris en charge par (XML et non-XML) Yes. Pris en charge (XML et non-XML)
Accès aux fichiers cloud DATA_SOURCEprend en charge Stockage Blob Azure dans SQL Server 2017 (14.x) et versions ultérieures, Azure SQL Database et Azure SQL Managed Instance. SQL Server 2019 CU11 et les mises à jour ultérieures prennent également en charge ADLS Gen2. Le stockage compatible S3 n’est pas pris en charge. DATA_SOURCEprend en charge Stockage Blob Azure dans SQL Server 2017 (14.x) et versions ultérieures, ADLS Gen2 dans SQL Server 2019 CU11 et versions ultérieures, ainsi que le stockage compatible S3 dans SQL Server 2022 (16.x) et versions ultérieures. Azure SQL Database et Azure SQL Managed Instance prennent en charge Stockage Blob Azure et ADLS Gen2. La base de données SQL dans Fabric prend en charge OneLake et le stockage externe via des raccourcis OneLake.
Fichiers Parquet ou Delta Non pris en charge. Texte csv/délimité uniquement Yes. SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Managed Instance et Azure SQL Database prennent en charge FORMAT = 'PARQUET' et FORMAT = 'DELTA' ; la base de données SQL dans Fabric prend en charge FORMAT = 'PARQUET' mais pas DELTA. Pour plus d’informations, consultez OPENROWSET BULK (Transact-SQL).
Autorisation requise ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, plus INSERT sur la table cible ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS
Journalisation minimale Yes. Pris en charge sous des modèles de restauration simples ou en vrac avec TABLOCK Yes. Prise en charge lorsqu’elle est utilisée avec INSERT ... SELECT et TABLOCK
  • BULK INSERT charge les données d’un fichier directement dans une table de destination, tandis que OPENROWSET(BULK ...) renvoie un jeu de résultats que vous pouvez utiliser dans une instruction SELECT ou INSERT ... SELECT.
  • BULK INSERT est une instruction autonome, tandis OPENROWSET(BULK ...) que doit être utilisée à l’intérieur d’une requête telle que SELECT * FROM OPENROWSET(BULK ...) ou INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...).
  • BULK INSERT écrit toujours directement sur une table cible, tandis que OPENROWSET(BULK ...) peut SELECT depuis un fichier sans insérer nulle part ni insérer dans une table ou une table temporaire.
  • BULK INSERT a un support limité pour les transformations de colonnes car les données circulent du fichier vers la table as-is, avec un mappage contrôlé par un ordre de fichier ou de colonne. OPENROWSET(BULK ...) prend en charge les expressions, CAST, les filtres WHERE, JOIN et les colonnes calculées dans l’environnement SELECT.
  • BULK INSERT utilise une WITH clause pour BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK, , et d’autres indices. OPENROWSET(BULK ...) supporte les indices de table via INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...).
  • BULK INSERT ne prend pas en charge l’importation de valeur unique d’objets volumineux. OPENROWSET(BULK ...) prend en charge SINGLE_BLOB, SINGLE_CLOB et SINGLE_NCLOB pour importer un fichier dans son intégralité sous la forme d’une valeur varbinary(max), varchar(max) ou nvarchar(max), respectivement.
  • OPENROWSET(BULK ...) et BULK INSERT prennent tous deux en charge les fichiers aux formats XML et non XML.
  • Pour l’accès aux fichiers cloud avec BULK INSERT, le DATA_SOURCE paramètre prend en charge Stockage Blob Azure dans SQL Server 2017 (14.x) et versions ultérieures, Azure SQL Database, et Azure SQL Managed Instance. SQL Server 2019 CU11 et les mises à jour ultérieures prennent également en charge ADLS Gen2, mais BULK INSERT ne supportent pas le stockage compatible S3. Pour OPENROWSET(BULK ...), DATA_SOURCE prend en charge Stockage Blob Azure dans SQL Server 2017 (14.x) et versions ultérieures, ADLS Gen2 dans SQL Server 2019 CU11 et versions ultérieures, ainsi que le stockage compatible S3 dans SQL Server 2022 (16.x) et versions ultérieures. Azure SQL Database et Azure SQL Managed Instance prennent en charge Stockage Blob Azure et ADLS Gen2. La base de données SQL dans Fabric prend en charge OneLake et le stockage externe via des raccourcis OneLake.
  • BULK INSERT ne prend pas en compte les fichiers Parquet ou Delta et ne prend en charge que le CSV ou le texte délimité. OPENROWSET(BULK ...)prend en charge FORMAT = 'PARQUET' et FORMAT = 'DELTA' dans SQL Server 2022 (16.x) et versions ultérieures, Azure SQL Database et Azure SQL Managed Instance. La base de données SQL dans Fabric prend en charge FORMAT = 'PARQUET' mais pas FORMAT = 'DELTA'. Pour plus d’informations, consultez OPENROWSET BULK (Transact-SQL).
  • BULK INSERT nécessite ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS plus INSERT permission sur la table cible, tandis que OPENROWSET(BULK ...) nécessite ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS.
  • BULK INSERT Prend en charge la journalisation minimale sous le modèle de récupération simple ou en bloc avec TABLOCK. OPENROWSET(BULK ...) Prend en charge un minimum de journalisation lorsqu’il est utilisé avec INSERT ... SELECT et TABLOCK.

Quand choisir BULK INSERT

Utilisez cette option BULK INSERT lorsque vous disposez d’une charge de fichier à table simple et que vous n’avez pas besoin de transformer, de filtrer ou de joindre des données pendant l’importation. Il utilise une syntaxe plus simple pour csv ou d’autres fichiers délimités :

Cet exemple de requête charge un fichier CSV à partir du Stockage Blob Azure directement dans une table.

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

Cet exemple de requête charge un fichier local avec un fichier de format pour le mappage de colonnes.

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

Quand choisir OPENROWSET(BULK)

Utilisez OPENROWSET(BULK ...) quand vous avez besoin d’une ou plusieurs des conditions suivantes :

  • Utilisez OPENROWSET(BULK ...) pour interroger ou prévisualiser des données de fichiers sans créer d’abord de tableau.
  • À utiliser OPENROWSET(BULK ...) pour transformer, filtrer ou relier des données lors de l’importation.
  • Utilisez OPENROWSET(BULK ...) pour charger des fichiers Parquet ou Delta, car BULK INSERT ne prend pas en charge ces formats.
  • Utiliser OPENROWSET(BULK ...) pour importer un fichier entier en tant que valeur LOB unique avec SINGLE_BLOB, SINGLE_CLOB, ou SINGLE_NCLOB.

Cet exemple de requête affiche un aperçu d’un fichier CSV à partir du Stockage Blob Azure sans insérer les données n’importe où.

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

Cet exemple de requête insère des données avec transformation et filtrage.

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;

Cet exemple de requête charge un fichier Parquet (pas possible avec BULK INSERT).

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

Cet exemple de requête importe un fichier XML entier sous forme de valeur varbinary(max).

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

Conseil / Astuce

Une approche consiste à commencer avec OPENROWSET(BULK ...) dans un SELECT pour explorer et valider les données de fichier, puis à passer à BULK INSERT pour la charge de production finale si vous n’avez pas besoin de transformations. Si vous avez besoin d’une prise en charge de Parquet ou Delta ou d’un filtrage en ligne, conservez OPENROWSET.

Pour plus d’informations, consultez les guides connexes suivants :

Fonctions de métadonnées utiles

Lorsque vous interrogez des fichiers externes à l’aide de OPENROWSET ou de tables externes, utilisez les fonctions et procédures intégrées pour inspecter les métadonnées des fichiers, détecter les schémas et mettre en œuvre des requêtes tenant compte du partitionnement.

filepath() et filename()

Les fonctions filepath() et les fonctions filename() retournent des parties du chemin d'accès du fichier ou du nom de fichier pour chaque ligne du jeu de résultats. Ils sont particulièrement utiles pour :

  • Élimination de partition : filtrez les segments de dossiers (par exemple, les partitions année/mois/jour) afin que le moteur lit uniquement les fichiers correspondants au lieu d’analyser tout.

  • Exposition des métadonnées sources : incluez le nom ou le chemin d’accès du fichier d’origine en tant que colonne dans les résultats de la requête, ce qui est utile pour l’audit ou le débogage.

Fonction Retours Exemple
filename() Nom de fichier (y compris l’extension) du fichier source pour chaque ligne sales_2025_01.parquet
filepath(N) le Nème segment de dossier depuis le caractère générique (*) dans le chemin BULK, où N commence à 1 Pour le chemin sales/2025/01/*.parquet, filepath(1) retourne 2025, filepath(2) retourne 01

S’applique à : Azure SQL Database, Azure SQL Managed Instance, SQL Server 2022 (16.x) et versions ultérieures, base de données SQL dans Fabric.

Cet exemple de requête utilise filepath() pour l’élimination de partition et filename() pour identifier les fichiers sources. Il lit uniquement les fichiers sous le /2025/ dossier et lit uniquement les fichiers sous le /06/ sous-dossier.

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

Conseil / Astuce

Placez les filtres filepath() dans la clause WHERE plutôt que dans une sous-requête ou un CTE. Lorsque le filtre se trouve dans la WHERE clause, le moteur peut effectuer l’élimination de partition au niveau de l’analyse du fichier, ce qui réduit considérablement les E/S.

sp_describe_first_result_set - découvrir les types de colonnes OPENROWSET

Lorsque vous utilisez des fichiers Parquet avec OPENROWSET, le moteur infère automatiquement les types de données de colonne (inférence de schéma). Les types déduits peuvent être plus grands que nécessaire. Par exemple, les colonnes de caractères sont souvent déduites en tant que varchar(8000), car les métadonnées Parquet n’incluent pas de longueur maximale. Ce choix peut dégrader les performances et consommer plus de mémoire.

Permet sp_describe_first_result_set d’inspecter le schéma déduit avant de finaliser votre requête. Après avoir vu les types déduits, spécifiez des types plus étroits dans une WITH clause pour améliorer les performances.

  • Étape 1 : Inspecter le schéma déduit.

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

    La sortie affiche le nom de chaque colonne, le type de données déduit, la longueur maximale, la précision et l’échelle de chaque colonne. Si vous voyez varchar(8000) où un varchar(100) suffirait, supplantez-le.

  • Étape 2 : Utiliser des types explicites pour améliorer les performances.

    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’inférence de schéma fonctionne uniquement avec les fichiers Parquet. Pour les fichiers CSV, spécifiez toujours des définitions de colonne dans une WITH clause (for OPENROWSET) ou dans l’instruction CREATE EXTERNAL TABLE . sp_describe_first_result_set est une procédure générale pour SQL Server, Azure SQL Database, Azure SQL Managed Instance et les bases de données SQL dans Fabric, mais elle est particulièrement utile pour les requêtes OPENROWSET. Pour plus d’informations, voir sp_describe_first_result_set.

Performances, résolution des problèmes et meilleures pratiques

Après avoir implémenté la virtualisation des données, utilisez ces guides pour optimiser les performances, diagnostiquer les problèmes et garantir la préparation de la production :

Domaine Article Détails
Les performances de PolyBase Considérations relatives aux performances dans PolyBase pour SQL Server Statistiques, pushdown, parallélisme et gestion de la mémoire
Calcul pushdown Calculs pushdown dans PolyBase Spécifie quelles opérations poussent vers la source distante
Comment savoir si un pushdown s’est produit Guide pratique pour savoir si un pushdown externe s’est produit Plans de requête et DMV
Résolution des problèmes Surveiller et résoudre les problèmes de PolyBase Problèmes courants et leur résolution
Connectivité Kerberos Résoudre des problèmes de connectivité de PolyBase Kerberos
FORUM AUX QUESTIONS Questions fréquemment posées sur PolyBase
Erreurs et solutions Erreurs PolyBase et solutions possibles