Compartir vía


Conexión, consulta y exportación de datos con PolyBase

Aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceBase de datos SQL en Microsoft Fabric

La virtualización de datos permite ejecutar consultas de Transact-SQL (T-SQL) a través de datos externos sin cargarlos en la base de datos. PolyBase es la característica motor de base de datos que implementa la virtualización de datos en SQL Server y Azure SQL. Defina un origen de datos externo, un formato de archivo opcional y una tabla externa y, a continuación, consulte la tabla externa con SELECT como cualquier otra tabla.

Esta guía le ayuda a:

  • Comprenda qué características de PolyBase admiten su plataforma SQL y su versión.
  • Elija entre OPENROWSET, tablas externas y BULK INSERT para consultar o ingerir datos.
  • Siga los vínculos paso a paso para escenarios comunes.
  • Revise el rendimiento, la solución de problemas y los procedimientos recomendados para cargas de trabajo de producción.

Casos de uso comunes

En la tabla siguiente se describen posibles escenarios de uso.

Escenario Uso
Exploración de archivos ad hoc OPENROWSET(BULK ...)
Consulta de archivos reutilizables para BI/reporting Tablas externas sobre archivos
Consulta entre bases de datos (SQL Server, Oracle, Teradata, MongoDB, ODBC) Conectores de PolyBase con tablas externas
Exportación de resultados de consulta a archivos CREATE EXTERNAL TABLE AS SELECT (CETAS)
Ingesta masiva en tablas BULK INSERT o OPENROWSET(BULK ...) con INSERT ... SELECT

¿Qué características están disponibles y dónde?

En la tabla siguiente se muestran qué características principales de virtualización de datos y PolyBase están disponibles en cada plataforma SQL. Use esta tabla para determinar lo que puede hacer en la plataforma antes de usar las guías detalladas.

Feature SQL Server 2019 SQL Server 2022 SQL Server 2025 Azure SQL Database Instancia Gestionada de Azure SQL Base de datos SQL en Microsoft Fabric
tablas externas
OPENROWSET (BULK) 1
CETAS (exportación) No No No
Archivos CSV/delimitados 2
Archivos de Parquet No
Tablas de Delta Lake No No No No
Conexión a otra instancia de SQL Server No No No
Conexión a Azure SQL Database o Instancia administrada de Azure SQL 3 3 3 No No No
Conexión a Oracle/Teradata/MongoDB No No No
Conexión con Azure Blob Storage No
Conexión a ADLS Gen2 No No
Conexión al almacenamiento compatible con S3 No No No No
Conexión a OneLake (Fabric) No No No No No
Cálculo de inserciones No No No
Autenticación de identidad administrada No No 4 No

1 SQL Server 2019 (15.x) admite OPENROWSET(BULK...) rutas de acceso de archivos locales y de red. En SQL Server 2022 (16.x) y versiones posteriores, OPENROWSET(BULK...) también admite la lectura desde el almacenamiento en la nube con FORMAT = 'PARQUET', FORMAT = DELTAy FORMAT = 'CSV'.

2 Compatibilidad con CSV en SQL Server 2019 (15.x) requiere Hadoop. En SQL Server 2022 (16.x) y versiones posteriores, CSV se admite de forma nativa sin Hadoop.

3 Usa el conector de SQL Server (sqlserver://). La credencial con ámbito de base de datos tiene como destino el punto de conexión de Azure SQL, los mismos pasos que para conectarse a otro servidor SQL Server.

4 Se admite la autenticación de identidad administrada para conectarse a Azure Blob Storage (ABS) y ADLS Gen2. Requiere SQL Server habilitado para Azure Arc o SQL Server en una máquina virtual de Azure para SQL Server local. Está disponible de forma nativa en Azure SQL Database e Instancia administrada de Azure SQL.

Nota:

A partir de SQL Server 2025 (17.x), consultar archivos de datos (CSV, Parquet y Delta) en Azure Blob Storage, ADLS Gen2 o almacenamiento compatible con S3 es una funcionalidad de motor nativa y ya no requiere instalar o ejecutar servicios de PolyBase. Los conectores RDBMS (SQL Server, Oracle, Teradata, MongoDB, ODBC) todavía requieren que los servicios de PolyBase se instalen y ejecuten. SQL Server 2025 (17.x) también agrega compatibilidad con Linux para estos conectores, que anteriormente estaban disponibles solo en Windows.

Consulta de datos externos

Antes de elegir un escenario específico, comprenda las tres maneras de consultar datos externos:

Enfoque Sintaxis Se utiliza cuando Autenticación PolyBase requerido
Consultas ad hoc de OLE DB OPENROWSET(provider, connection, query) Quiere una consulta rápida y única, sin objetos persistentes, o necesita autenticación de Microsoft Entra ID. Autenticación de SQL, autenticación de Windows, Id. de Microsoft Entra (MSOLEDBSQL) No
Presentar consultas ad hoc OPENROWSET(BULK ...) Quiere explorar los datos de archivos rápidamente o probar esquemas antes de crear una tabla. Token de SAS, clave de acceso, identidad administrada, identificador de Microsoft Entra Sí para Azure SQL Database e Instancia administrada de Azure SQL

No para instancias de SQL Server
Conectores de datos persistentes CREATE EXTERNAL TABLE con sqlserver://, oracle://, teradata://, etc. Necesita acceso recurrente, gobernanza, estadísticas y cálculo de empuje para producción. Solo autenticación SQL

Los servicios de PolyBase son necesarios para el acceso a archivos en la nube en SQL Server 2019 (15.x) y SQL Server 2022 (16.x). SQL Server 2025 (17.x) y versiones posteriores tienen compatibilidad nativa con CSV, Parquet y Delta sin PolyBase.

Guía para la toma de decisiones

Escenario Recomendación
Necesito la autenticación de Id. de Microsoft Entra para SQL remoto o quiero evitar los servicios de PolyBase. Uso OPENROWSET(MSOLEDBSQL, ...) (ad hoc, sin objetos persistentes)
Necesito tablas persistentes, estadísticas o cálculo delegado en bases de datos remotas Uso CREATE EXTERNAL TABLE con conectores de PolyBase (sqlserver://, oracle://, teradata://, mongodb://, odbc://). OPENROWSET no admite conectores
Estoy explorando un nuevo archivo o probando un esquema Uso OPENROWSET(BULK ...) (iteración rápida, sin objetos persistentes)
Ingreso datos del archivo en una tabla con transformaciones Usa INSERT ... SELECT desde OPENROWSET(BULK ...)
Necesito gobernanza o acceso compartido para muchos usuarios o aplicaciones Use CREATE EXTERNAL TABLE para que los permisos y los metadatos estén centralizados.
Trabajo en SQL Database en Fabric Use OPENROWSET(BULK ...) para consultas ad hoc de OneLake o tablas externas para acceso reutilizable; para almacenamiento externo, use accesos directos de OneLake.

Elección del escenario

Ahora que comprende los tres enfoques, use una de las siguientes guías para implementar su caso de uso específico.

Archivos de consulta (Parquet, CSV o Delta)

Si los datos están en archivos Parquet, CSV o Delta en Azure Blob Storage, ADLS Gen2, almacenamiento compatible con S3 o OneLake, siga una de estas guías:

Escenario Guía recomendada Plataformas
Consulta rápida ad hoc en un archivo Parquet o CSV Utilice OPENROWSET. No se necesita ninguna tabla externa SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Database, Instancia administrada de Azure SQL, SQL Database en Fabric
Consultas repetidas en archivos Parquet con un esquema persistente Crea una tabla externa sobre Parquet SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Database, Instancia administrada de Azure SQL, SQL Database en Fabric
Consulta de archivos CSV con una tabla externa Creación de una tabla externa con un formato de archivo para texto delimitado SQL Server 2019 (15.x) y versiones posteriores, Azure SQL Database, Instancia administrada de Azure SQL, SQL Database en Fabric
Consulta de tablas de Delta Lake Creación de una tabla externa con FILE_FORMAT = DeltaLakeFileFormat SQL Server 2022 (16.x) y versiones posteriores
Exportar los resultados de la consulta a archivos Parquet o CSV (CETAS) Utilice CREATE EXTERNAL TABLE AS SELECT SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Managed Instance

También puede seguir uno de estos tutoriales paso a paso:

Tutorial Descripción
Introducción a PolyBase en SQL Server 2022 Cubre OPENROWSET con Parquet y CSV, tablas externas y navegación por carpetas.
Virtualización del archivo parquet en un almacenamiento de objetos compatible con S3 con PolyBase Tutorial para SQL Server 2022 (16.x) y versiones posteriores.
Virtualizar archivo CSV con PolyBase Tutorial para SQL Server 2022 (16.x) y versiones posteriores.
Virtualizar tabla delta con PolyBase Tutorial para SQL Server 2022 (16.x) y versiones posteriores.
Virtualización de datos con Azure SQL Database (versión preliminar) Guía de Azure SQL Database para Parquet y CSV.
Virtualización de datos con Azure SQL Managed Instance Guía de Azure SQL Managed Instance para Parquet, CSV y CETAS.
Virtualización de datos en bases de datos SQL en Fabric Guía de base de datos SQL en Fabric para archivos de OneLake.

Conexión a otra instancia de SQL Server, Azure SQL Database o Instancia administrada de SQL

En SQL Server 2019 (15.x) y versiones posteriores, PolyBase puede consultar tablas en otra instancia de SQL Server, Azure SQL Database o Instancia administrada de Azure SQL, sin usar servidores vinculados.

Importante

El conector sqlserver:// no es compatible con la base de datos SQL en Fabric. Los conectores RDBMS de PolyBase usan la autenticación SQL a través de CREATE DATABASE SCOPED CREDENTIAL y no admiten la autenticación con Microsoft Entra ID, Managed Identity o principal de servicio. Dado que SQL Database en Fabric requiere la autenticación de Microsoft Entra, no se puede conectar a ella mediante PolyBase.

Paso Qué hacer
1. Instalación de PolyBase Instalación de PolyBase en Windows o instalación de PolyBase en Linux
2. Crear una credencial CREATE DATABASE SCOPED CREDENTIAL con el login objetivo
3. Crear un origen de datos externo CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')
4. Crear una tabla externa CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')
5. Consulta SELECT * FROM <external_table>

Sugerencia

El conector de SQL Server (sqlserver://) también funciona para Azure SQL Database e Instancia administrada de Azure SQL. Siga los mismos pasos y establezca en LOCATION el punto de conexión de Azure SQL (por ejemplo, sqlserver://myserver.database.windows.net).

Para obtener una guía detallada, consulte Configuración de PolyBase para acceder a datos externos en SQL Server.

Conexión a Oracle, Teradata o MongoDB

SQL Server 2019 (15.x) y versiones posteriores pueden consultar Oracle, Teradata, MongoDB y Cosmos DB mediante conectores ODBC de PolyBase.

Origen de datos Guía Requisitos
Oracle Configurar PolyBase para acceder a datos externos en Oracle SQL Server 2019 (15.x) y versiones posteriores, controladores de cliente de Oracle
Teradata Configurar PolyBase para obtener acceso a datos externos en Teradata SQL Server 2019 (15.x) y versiones posteriores, controlador ODBC de Teradata
MongoDB/Cosmos DB Configurar PolyBase para acceder a datos externos en MongoDB SQL Server 2019 (15.x) y versiones posteriores, controlador ODBC de MongoDB
Cualquier origen ODBC Configuración de PolyBase para acceder a datos externos con tipos genéricos de ODBC SQL Server 2019 (15.x) y versiones posteriores (Windows)

(Linux a partir de SQL Server 2025 (17.x))

Conexión a Azure Blob Storage o ADLS Gen2

Plataforma SQL Opciones de autenticación Guía
SQL Server 2022 (16.x) y versiones posteriores Token de SAS, clave de acceso, Identidad administrada (a partir de SQL Server 2025 (17.x)) Configuración de PolyBase para acceder a datos externos en Azure Blob Storage
SQL Server 2019 (15.x) Clave de acceso (a través del conector de Hadoop) Configuración de PolyBase para acceder a datos externos en Azure Blob Storage
Azure SQL Database Token de SAS, identidad administrada, paso a través de Microsoft Entra Virtualización de datos con Azure SQL Database (versión preliminar)
Instancia Gestionada de Azure SQL Token de SAS, identidad administrada Virtualización de datos con Azure SQL Managed Instance

En SQL Server 2022 (16.x), los prefijos de URI cambiaron. Al migrar desde SQL Server 2019 (15.x) o versiones anteriores:

  • Azure Blob Storage: Cambiar wasb[s]:// a abs://
  • ADLS Gen2: Cambiar abfs[s]:// a adls://

Para más información, consulte Configuración de PolyBase para acceder a datos externos en Azure Blob Storage.

Conexión al almacenamiento de objetos compatible con S3

SQL Server 2022 (16.x) y versiones posteriores admiten almacenamiento compatible con S3, como Amazon S3, MinIO y Ceph.

Para obtener más información, vea Configuración de PolyBase para acceder a datos externos en el almacenamiento de objetos compatible con S3.

Exportación de datos con CREATE EXTERNAL TABLE AS SELECT (CETAS)

CETAS exporta los resultados de la consulta a archivos externos (Parquet o CSV) en Azure Blob Storage, ADLS Gen2 o almacenamiento compatible con S3.

Plataforma SQL Soportado Formatos de exportación Notas
SQL Server 2022 (16.x) y versiones posteriores Parquet, CSV Requiere configuración del servidor: permitir la exportación de polybase
Instancia Gestionada de Azure SQL Parquet, CSV Deshabilitado de forma predeterminada
Azure SQL Database No Ninguno No disponible
Base de datos SQL en Fabric No Ninguno No disponible

Para obtener la referencia de Transact-SQL, vea CREATE EXTERNAL TABLE AS SELECT (CETAS).

Ejemplos de inicio rápido

Ejemplo 1: consulta ad hoc en un archivo Parquet (OPENROWSET)

No se necesita ninguna tabla externa. Funciona en SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance y SQL Database en Fabric.

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

Ejemplo 2: Tabla externa sobre CSV en Azure Blob Storage

Este ejemplo funciona en todas las plataformas SQL que admiten PolyBase.

  • Paso 1: Crear una clave maestra de base de datos (DMK). Este paso es necesario porque la credencial almacena un secreto de token de SAS. Sin embargo, puede realizar este paso si usa la identidad administrada o la autenticación de Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>';
    
  • Paso 2: Crear una credencial con un token de SAS. Omita el valor inicial ?.

    CREATE DATABASE SCOPED CREDENTIAL MyStorageCred
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
         SECRET = '<your_SAS_token>'; -- omit the leading '?'
    
  • Paso 3: Crear un origen de datos externo.

    CREATE EXTERNAL DATA SOURCE MyAzureStorage
    WITH (
        LOCATION = 'abs://mycontainer@mystorageaccount.blob.core.windows.net',
        CREDENTIAL = MyStorageCred
    );
    
  • Paso 4: Crear un formato de archivo para el CSV.

    CREATE EXTERNAL FILE FORMAT CsvFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (
            FIELD_TERMINATOR = ',',
            STRING_DELIMITER = '"',
            FIRST_ROW = 2
        )
    );
    
  • Paso 5: Crear la tabla externa.

    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
    );
    
  • Paso 6: Consultar la tabla externa.

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

Ejemplo 3: Consulta de una tabla en otro servidor SQL Server

Este ejemplo funciona en SQL Server 2019 (15.x) y versiones posteriores.

  • Paso 1: Crear una clave maestra de base de datos (necesaria porque la credencial almacena una contraseña).

    CREATE MASTER KEY ENCRYPTION
    BY PASSWORD = '<strong_password>';
    
  • Paso 2: Crear una credencial para la instancia remota de SQL Server.

    CREATE DATABASE SCOPED CREDENTIAL RemoteSqlCred
    WITH IDENTITY = 'remote_user',
         SECRET = '<password>';
    
  • Paso 3: Crear el origen de datos externo.

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • Paso 4: Crear la tabla externa (nombre de tres partes en 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'
    );
    
  • Paso 5: Consultar entre servidores.

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

Ejemplo 4: Exportación de resultados a Parquet con CETAS

Funciona en SQL Server 2022 (16.x) y versiones posteriores, Instancia administrada de Azure SQL.

  • Paso 1: Habilitar CETAS (solo SQL Server).

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • Paso 2: Creación de credenciales y orígenes de datos (reutilización de ejemplos anteriores).

  • Paso 3: Crear un formato de archivo para la exportación de Parquet.

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • Paso 4: Exportar los resultados de la consulta.

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

Bloques de creación de T-SQL para PolyBase

Antes de implementar cualquier escenario, comprenda los objetos T-SQL principales que usa PolyBase y cómo encajan juntos:

Diagrama que muestra polyBase Transact-SQL objetos y sus relaciones.

Diagrama que muestra los objetos T-SQL de PolyBase y sus relaciones, desde la autenticación (clave maestra de base de datos, credenciales) a través de orígenes de datos y formatos de archivo para consultar métodos (Tabla externa, OPENROWSET, BULK INSERT, CETAS).

Para obtener información sobre estas instrucciones T-SQL, vea:

Para obtener una referencia de Transact-SQL completa para todos los objetos, consulte Referencia de Transact-SQL polyBase.

Importante

Compruebe la asignación de tipos de datos para el formato de archivo externo. Al crear un formato de archivo externo o consultar archivos mediante OPENROWSET, PolyBase asigna automáticamente tipos de datos de origen (Parquet, CSV, Delta, Oracle, Teradata, MongoDB) a tipos de datos de SQL Server. Los tipos no coincidentes pueden provocar un truncamiento silencioso, una pérdida de precisión o errores de consulta. Por ejemplo, un Parquet DECIMAL(38,18) se mapea a DECIMAL(18,0). Revise las tablas de asignación antes de definir columnas de tablas externas o una cláusula WITH. Para obtener la referencia completa, consulte Asignación de tipos con PolyBase.

¿Cuándo se requiere CREATE MASTER KEY?

Se crea una clave maestra de base de datos (DMK) mediante la sintaxis CREATE MASTER KEY. DMK cifra los secretos almacenados en credenciales delimitadas por el ámbito de la base de datos. Solo es necesario cuando la credencial contiene un valor secreto, es decir, cuando almacena una contraseña, un token o una clave de acceso.

  • DmK es obligatorio (las credenciales almacenan un secreto):

    Tipo de autenticación Valor de IDENTITY Tiene secreto DMK
    Token de SAS 'SHARED ACCESS SIGNATURE' Obligatorio
    Tecla de acceso S3 'S3 ACCESS KEY' Obligatorio
    Inicio de sesión de SQL/autenticación básica '<username>' Obligatorio
    Clave de acceso de la cuenta de almacenamiento '<storage_account_name>' Obligatorio
  • DMK no es necesario (no se almacena ningún secreto):

    Tipo de autenticación Valor de IDENTITY Tiene secreto DMK
    Identidad administrada 'Managed Identity' No No es necesario
    Microsoft Entra ID 'User Identity' o 'Managed Identity' No No es necesario

Sugerencia

Si no hay ningún secreto en su instrucción CREATE DATABASE SCOPED CREDENTIAL, no necesita una DMK. Identidad administrada y la autenticación de Microsoft Entra ID delegan la confianza en la plataforma. La base de datos no almacena contraseñas ni tokens.

Ejemplos:

En esta consulta de ejemplo, se requiere la DMK (las credenciales almacenan un token de SAS).

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

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

En esta consulta de ejemplo, la DMK no es necesaria (identidad administrada, ningún secreto).

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

En esta consulta de ejemplo, la DMK no es necesaria (autenticación directa de Microsoft Entra, sin necesidad de secreto).

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

Acceso remoto a datos con OPENROWSET y tablas externas

SQL Server ofrece tres enfoques distintos para consultar datos remotos. Puede elegir el enfoque adecuado cuando comprenda las diferencias en la sintaxis, la autenticación y la arquitectura.

Enfoque Sintaxis Se conecta a Autenticación Servicios de PolyBase Plataformas
Consultas OLE DB OPENROWSET(provider, connection, query) Cualquier origen OLE DB a través de MSOLEDBSQL, SQLOLEDB u otros proveedores Autenticación de SQL, autenticación de Windows, Id. de Microsoft Entra (MSOLEDBSQL) No SQL Server (todas las versiones compatibles)
Consultas de archivos OPENROWSET(BULK ...) Archivos en disco local, red o nube (Azure Blob, ADLS, S3, OneLake) Token de SAS, clave de acceso, identidad administrada, identificador de Microsoft Entra Sí para la nube*; No para local SQL Server 2005; SQL Server 2022 (16.x) y versiones posteriores (nube); Azure SQL
Conectores de PolyBase CREATE EXTERNAL TABLE con CREATE EXTERNAL DATA SOURCE usando sqlserver://, oracle://, teradata://, mongodb://, odbc:// Orígenes SQL Server remoto, Oracle, Teradata, MongoDB y ODBC Solo autenticación SQL SQL Server 2019 (15.x) y versiones posteriores (Windows); SQL Server 2025 (17.x) y versiones posteriores (Linux)

Los servicios de PolyBase son necesarios para el acceso a archivos en la nube en SQL Server 2019 (15.x) y SQL Server 2022 (16.x). SQL Server 2025 (17.x) y versiones posteriores tienen compatibilidad nativa con archivos en la nube y ya no requieren PolyBase para CSV, Parquet o Delta.

Cuándo usar cada enfoque

Use OLE DB OPENROWSET para:

  • Consultas ad hoc rápidas y únicas sin crear objetos persistentes
  • Autenticación de Microsoft Entra ID o Identidad Administrada (a través de MSOLEDBSQL)
  • Evitar dependencias del servicio PolyBase
  • Conexión a cualquier origen de datos con un proveedor OLE DB

Use el archivo OPENROWSET(BULK) para:

  • Exploración de archivos ad hoc y detección de esquemas
  • Transformaciones rápidas y vistas previas antes de aplicar una definición de tabla
  • Transformaciones flexibles de columnas en línea (conversión, filtrado, columnas calculadas)
  • Datos que no cambian con frecuencia y no necesitan metadatos persistentes

Utilice conectores PolyBase con CREATE EXTERNAL TABLE para:

  • Definiciones de tabla persistentes y reutilizables a las que acceden varios usuarios o aplicaciones
  • Cargas de trabajo de producción que requieren estadísticas y optimización del plan de consulta
  • Procesamiento delegable en orígenes remotos (delegación de filtros en Oracle, SQL Server, etc.)
  • Gobernanza y seguridad compartidas (una vez creados, los usuarios solo necesitan SELECT permiso)
  • Cuando tenga la autenticación de SQL disponible para el origen remoto

OPENROWSET (OLE DB): consultas remotas ad hoc (no se requieren servicios de PolyBase)

El formulario OLE DB de OPENROWSET se conecta a un origen de datos remoto a través de un proveedor OLE DB, ejecuta una consulta de paso a través y devuelve los resultados como un conjunto de filas. Es una alternativa ad hoc única a un servidor vinculado. No se crea ningún metadato persistente. Esta sintaxis no requiere servicios de PolyBase y no admite archivos en la nube ni orígenes de datos externos.

Esta consulta de ejemplo se conecta a un servidor SQL Server remoto a través de OLE DB (no PolyBase).

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

OPENROWSET(BULK): consultas basadas en archivos (PolyBase)

El BULK formato de OPENROWSET lee datos directamente desde archivos. En SQL Server 2019 (15.x) y versiones anteriores, lee desde rutas de acceso de archivo locales o UNC y requiere un archivo de formato. En SQL Server 2022 (16.x) y versiones posteriores, puede leer desde el almacenamiento en la nube utilizando los parámetros DATA_SOURCE y FORMAT. Este enfoque es la versión integrada de PolyBase que se usa para la virtualización de datos.

En el contexto de PolyBase y la virtualización de datos, cuando esta guía hace referencia a OPENROWSET, se refiere a la sintaxis OPENROWSET(BULK ...) con una cláusula FORMAT para consultar archivos externos.

Ejemplos:

Esta consulta de ejemplo lee un archivo Parquet de Azure Blob Storage (SQL Server 2022 y versiones posteriores).

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

En este ejemplo de consulta, se lee un archivo Parquet con una ruta de acceso en línea (Azure SQL Database, Instancia administrada de Azure SQL).

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

Cuándo usar OPENROWSET frente a tablas externas

Tanto OPENROWSET(BULK ...) como las tablas externas permiten consultar datos externos con T-SQL, pero están diseñadas para distintos casos de uso. En la tabla siguiente se resumen las diferencias clave que le ayudarán a decidir qué enfoque se ajusta a su escenario.

Capacidad OPENROWSET(BULK ...) Tabla externa
propósito Exploración ad hoc y consultas puntuales Definición de tabla persistente y reutilizable
Metadatos almacenados en la base de datos N.º No se guarda nada después de que se ejecute la consulta Sí. La definición de tabla, el origen de datos y el formato de archivo se almacenan como objetos de base de datos.
Definición de esquema Se deduce automáticamente del archivo (Parquet) o definido directamente con una cláusula de WITH Se define explícitamente en la CREATE EXTERNAL TABLE instrucción
Permisos Requiere ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS Una vez creado, el permiso estándar SELECT en la tabla es suficiente.
Columnas calculadas Sí. Agregue expresiones y columnas calculadas en la SELECT lista; las funciones de metadatos como filename() y filepath() solo están disponibles aquí. N.º Lista de columnas fija; realizar transformaciones en una vista o en la consulta que lee la tabla externa
Estadísticas Azure SQL: estadísticas manuales de columna única a través de sys.sp_create_openrowset_statistics; SQL Server 2022 (16.x) y versiones posteriores: crear automáticamente estadísticas en predicados (sin estadísticas manuales en SQL Server). Consulte estadísticas manuales de OPENROWSET. Compatibilidad completa CREATE STATISTICS en todas las plataformas, además de crear automáticamente en SQL Server 2022 (16.x) y versiones posteriores. Consulte Creación de estadísticas manuales de tabla externa.
Pushdown Soporte limitado. El motor podría insertar filtros en el análisis de archivos, pero no hay ningún empuje hacia los orígenes remotos de bases de datos relacionales (RDBMS). Sí. Soporta el cálculo delegado para conectores RDBMS (SQL Server, Oracle, Teradata, MongoDB)
Más adecuado para Exploración de datos, detección de esquemas, consultas de creación de prototipos, cargas de datos únicas, transformaciones flexibles Cargas de trabajo de producción, consultas repetidas, acceso compartido entre usuarios, paneles e informes

Utilice OPENROWSET cuando necesite flexibilidad

Use OPENROWSET para explorar un archivo, probar esquemas diferentes o agregar columnas calculadas y transformaciones sin crear objetos persistentes. Por ejemplo, puede extraer la ruta de acceso del archivo como una columna, convertir tipos de datos en línea o filtrar por expresiones calculadas en una sola consulta.

Esta consulta de ejemplo incluye columnas calculadas y transformaciones:

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

Sugerencia

Las filepath() funciones y filename() están disponibles en Azure SQL Database, Azure SQL Managed Instance y SQL Server 2022 (16.x) y versiones posteriores. Permiten filtrar por partes de la ruta de acceso de archivo (eliminación de particiones) y exponer el nombre de archivo de origen como una columna, lo cual no es posible directamente con tablas externas.

Utilice tablas externas cuando necesite persistencia y gestión

Use tablas externas cuando varios usuarios o aplicaciones necesiten consultar repetidamente los mismos datos externos. Defina el esquema, el origen de datos y las credenciales una vez y los almacene en la base de datos. Los consumidores solo necesitan SELECT permiso en la tabla.

Las tablas externas también admiten estadísticas, que el optimizador de consultas usa para crear mejores planes de ejecución. Puede crear estadísticas manualmente o dejar que el motor los cree automáticamente (SQL Server 2022 (16.x) y versiones posteriores).

Esta consulta de ejemplo crea estadísticas en una tabla externa para mejorar los planes de consulta.

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

Para obtener más información sobre las estadísticas de ambos enfoques, consulte Consideraciones de rendimiento de PolyBase: estadísticas.

BULK INSERT frente a OPENROWSET(BULK): ¿Cuál debo usar?

Tanto BULK INSERT como OPENROWSET(BULK ...) importan datos de archivos a SQL Server mediante el mismo motor de carga masiva subyacente. Sin embargo, difieren en la sintaxis, la flexibilidad y lo que puede hacer con los resultados. En la tabla siguiente se resumen las diferencias clave:

Nota:

BULK INSERT no está disponible en la base de datos SQL de Fabric. Para Fabric, usa OPENROWSET(BULK ...) en OneLake.

Capacidad BULK INSERT OPENROWSET(BULK ...)
Propósito básico Carga datos de un archivo directamente en una tabla de destino Devuelve un conjunto de filas que se utiliza en una instrucción SELECT o INSERT ... SELECT.
Patrón de uso Declaración independiente: BULK INSERT <table> FROM '<file>' Debe usarse dentro de una consulta: SELECT * FROM OPENROWSET(BULK ...) o INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)
¿Requiere una tabla de destino? Sí. Siempre escribe directamente en una tabla N.º SELECT Puede hacerlo sin insertar en ningún lugar o insertar en cualquier tabla o tabla temporal.
Transformaciones de columna durante la carga Soporte limitado. Los datos fluyen de archivo a tabla tal cual (asignación controlada por archivo de formato o por orden de columna) Soporte técnico completo. Puede agregar expresiones, CASTWHERE filtros, JOIN otras tablas y columnas calculadas en los alrededores.SELECT
Indicaciones para la tabla La WITH cláusula incluye compatibilidad con BATCHSIZE, , CHECK_CONSTRAINTS, FIRE_TRIGGERSKEEPIDENTITY, KEEPNULLS, , TABLOCK, y más Admite sugerencias de tabla mediante la sintaxis INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...)
Importación de un solo valor de objeto grande (LOB) No soportado Sí. Admite SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB para importar un archivo completo como un valor varbinary(max), varchar(max) o nvarchar(max)
Formato de archivos Sí. Compatible con (XML y no XML) Sí. Compatible (XML y no XML)
Acceso a archivos en la nube (Azure Blob Storage, ADLS Gen2, S3) Sí. Admitido mediante el parámetro DATA_SOURCE (SQL Server 2017 (14.x) y versiones posteriores, Azure SQL) Sí. Se admite mediante el parámetro DATA_SOURCE o la URL en línea con la cláusula FORMAT (SQL Server 2022 (16.x) y versiones posteriores, Azure SQL)
Archivos Parquet o Delta No está soportado. Solo texto CSV/delimitado Sí. Compatible con FORMAT = 'PARQUET' o FORMAT = 'DELTA' (SQL Server 2022 (16.x) y versiones posteriores, Azure SQL)
Permiso necesario ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS, más INSERT en la tabla de destino ADMINISTER BULK OPERATIONS o ADMINISTER DATABASE BULK OPERATIONS
Registro mínimo Sí. Compatible con modelos de recuperación simples o optimizados para cargas masivas con TABLOCK Sí. Se admite cuando se usa con INSERT ... SELECT y TABLOCK

Cuándo elegir BULK INSERT

Use BULK INSERT cuando tenga una carga sencilla de archivos a tabla y no sea necesario transformar, filtrar ni unir datos durante la importación. Usa una sintaxis más sencilla para CSV u otros archivos delimitados:

En esta consulta de ejemplo se carga un archivo CSV de Azure Blob Storage directamente en una tabla.

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

En esta consulta de ejemplo se carga un archivo local con un archivo de formato para la asignación de columnas.

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

Cuándo elegir OPENROWSET(BULK)

Use OPENROWSET(BULK ...) cuando necesite una o varias de las condiciones siguientes:

  • Consulte o obtenga una vista previa de los datos de archivo sin crear primero una tabla.
  • Transformar, filtrar o combinar datos durante la importación.
  • Cargar archivos Parquet o Delta (solo OPENROWSET admite estos formatos).
  • Importe un archivo completo como un único valor loB (SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB).

En esta consulta de ejemplo se obtiene una vista previa de un archivo CSV de Azure Blob Storage sin insertar los datos en ningún lugar.

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

En esta consulta de ejemplo se insertan datos con transformación y filtrado.

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;

Esta consulta de ejemplo carga un archivo Parquet (no es posible con BULK INSERT).

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

En esta consulta de ejemplo se importa un archivo XML completo como un único valor varbinary(max).

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

Sugerencia

Un enfoque consiste en empezar con OPENROWSET(BULK ...) en SELECT para explorar y validar los datos de archivo y, a continuación, cambiar a BULK INSERT para la carga de producción final si no necesita transformaciones. Si necesita compatibilidad con Parquet o Delta o filtrado en línea, manténgase con OPENROWSET.

Para obtener más información, consulte las siguientes guías relacionadas:

Funciones de metadatos útiles

Al consultar archivos externos con OPENROWSET o tablas externas, puede usar varias funciones y procedimientos integrados para inspeccionar metadatos de archivos, descubrir esquemas e implementar consultas optimizadas para particiones.

filepath() y filename()

Las filepath() funciones y filename() devuelven partes de la ruta de acceso del archivo o el nombre de archivo para cada fila del conjunto de resultados. Son especialmente útiles para:

  • Eliminación de particiones: filtre por segmentos de carpeta (por ejemplo, particiones de año/mes/día) para que el motor lea solo los archivos coincidentes en lugar de examinar todo.

  • Exponer metadatos de origen: incluya el nombre de archivo o la ruta de acceso de origen como una columna en los resultados de la consulta, lo que resulta útil para la auditoría o la depuración.

Function Devoluciones Ejemplo
filename() Nombre de archivo (incluida la extensión) del archivo de origen para cada fila sales_2025_01.parquet
filepath(N) El Nº segmento de carpeta desde el carácter comodín (*) en la ruta BULK, donde N comienza en 1 Para la ruta de acceso sales/2025/01/*.parquet, filepath(1) devuelve 2025, filepath(2) devuelve 01

Se aplica a: Azure SQL Database, Azure SQL Managed Instance, SQL Server 2022 (16.x) y versiones posteriores, SQL Database in Fabric.

En esta consulta de ejemplo se usa filepath() para la eliminación de particiones y filename() para identificar los archivos de origen. Solo lee los archivos de la /2025/ carpeta y solo lee los archivos de la /06/ subcarpeta.

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

Sugerencia

Coloque los filtros filepath() en la cláusula WHERE en lugar de en una subconsulta o CTE. Cuando el filtro está en la WHERE cláusula, el motor es capaz de realizar la eliminación de particiones a nivel de escaneo de archivos, lo que reduce significativamente la E/S.

sp_describe_first_result_set: detección de tipos de columna OPENROWSET

Cuando se usa OPENROWSET con archivos Parquet, el motor deduce automáticamente los tipos de datos de columna (inferencia de esquema). Los tipos inferidos pueden ser mayores de lo necesario. Por ejemplo, las columnas de caracteres a menudo se deducen como varchar(8000) porque los metadatos de Parquet no incluyen una longitud máxima. Esta opción puede degradar el rendimiento y consumir más memoria.

Use sp_describe_first_result_set para inspeccionar el esquema inferido antes de finalizar la consulta. Después de ver los tipos inferidos, especifique tipos más estrechos en una WITH cláusula para mejorar el rendimiento.

  • Paso 1: Inspeccionar el esquema inferido.

    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 salida muestra el nombre de cada columna, el tipo de datos inferido, la longitud máxima, la precisión y la escala. Si ve varchar(8000) donde bastaría un varchar(100), cámbielo:

  • Paso 2: Usar tipos explícitos para mejorar el rendimiento.

    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;
    

La inferencia de esquema solo funciona con archivos Parquet. Para los archivos CSV, siempre especifique las definiciones de columna en una WITH cláusula (para OPENROWSET) o en la CREATE EXTERNAL TABLE instrucción. sp_describe_first_result_set es un procedimiento general de SQL Server y Azure SQL, aunque es especialmente útil para las consultas de OPENROWSET. Para más información, véase sp_describe_first_result_set.

Rendimiento, solución de problemas y procedimientos recomendados

Después de implementar la virtualización de datos, use estas guías para optimizar el rendimiento, diagnosticar problemas y garantizar la preparación de producción:

Area Artículo Detalles
Rendimiento de PolyBase Consideraciones de rendimiento en PolyBase para SQL Server Estadísticas, delegación, paralelismo y administración de memoria
Cálculo de inserciones Computaciones delegadas en PolyBase Especifica qué operaciones se suben al origen remoto.
Cómo saber si se produjo el empuje Cómo saber si se ha producido un empuje externo Planes de consulta y DMV
Solución de problemas Supervisión y solución de problemas de PolyBase Errores comunes y soluciones
Conectividad Kerberos Solución de problemas de conectividad de Kerberos con PolyBase
Preguntas más frecuentes Preguntas más frecuentes sobre PolyBase
Errores y soluciones Errores de PolyBase y posibles soluciones