Compartilhar via


Conectar, consultar e exportar dados com o PolyBase

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

A virtualização de dados permite que você execute consultas Transact-SQL (T-SQL) em dados externos sem carregá-los em seu banco de dados. O PolyBase é o recurso do mecanismo de banco de dados que implementa a virtualização de dados no SQL Server e no SQL do Azure. Você define uma fonte de dados externa, um formato de arquivo opcional e uma tabela externa e, em seguida, consulta a tabela externa como SELECT qualquer outra tabela.

Este guia ajuda você a:

  • Entenda quais recursos do PolyBase são suportados pela sua plataforma e versão do SQL.
  • Escolha entre OPENROWSET, tabelas externas e BULK INSERT para consultar ou ingerir dados.
  • Siga os links passo a passo para cenários comuns.
  • Examine o desempenho, a solução de problemas e as práticas recomendadas para cargas de trabalho de produção.

Casos de uso comuns

A tabela a seguir descreve possíveis cenários de uso.

Scenario Utilização
Exploração de arquivo ad hoc OPENROWSET(BULK ...)
Consulta reutilizável de arquivos para Business Intelligence/relatórios Tabelas externas sobre arquivos
Consulta entre bancos de dados (SQL Server, Oracle, Teradata, MongoDB, ODBC) Conectores PolyBase com tabelas externas
Exportando resultados da consulta para arquivos CREATE EXTERNAL TABLE AS SELECT (CETAS)
Ingestão em massa em tabelas BULK INSERT ou OPENROWSET(BULK ...) com INSERT ... SELECT

Quais recursos estão disponíveis onde?

A tabela a seguir mostra quais recursos principais do PolyBase e da virtualização de dados estão disponíveis em cada plataforma SQL. Use esta tabela para determinar o que você pode fazer em sua plataforma antes de usar os guias detalhados.

Característica SQL Server 2019 SQL Server 2022 SQL Server 2025 Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Banco de dados SQL no Microsoft Fabric
tabelas externas Sim Sim Sim Sim Sim Sim
OPENROWSET (BULK) Sim 1 Sim Sim Sim Sim Sim
CETAS (exportação) No Sim Sim No Sim No
Arquivos CSV/delimitados Sim 2 Sim Sim Sim Sim Sim
Arquivos Parquet No Sim Sim Sim Sim Sim
Tabelas Delta Lake No Sim Sim No No No
Conectar-se a outro SQL Server Sim Sim Sim No No No
Conectar-se ao Banco de Dados SQL do Azure ou à Instância Gerenciada de SQL do Azure Sim 3 Sim 3 Sim 3 No No No
Conectar-se ao Oracle/Teradata/MongoDB Sim Sim Sim No No No
Conectar-se ao Armazenamento de Blobs do Azure Sim Sim Sim Sim Sim No
Conectar-se ao ADLS Gen2 No Sim Sim Sim Sim No
Conectar-se ao armazenamento compatível com S3 No Sim Sim No No No
Conectar-se ao OneLake (Fabric) No No No No No Sim
Computação por pushdown Sim Sim Sim No No No
Autenticação de Identidade Gerenciada No No Sim 4 Sim Sim No

1 O SQL Server 2019 (15.x) dá suporte a caminhos OPENROWSET(BULK...) de arquivos locais e de rede. No SQL Server 2022 (16.x) e versões posteriores, OPENROWSET(BULK...) também dá suporte à leitura do armazenamento em nuvem com FORMAT = 'PARQUET', FORMAT = DELTAe FORMAT = 'CSV'.

2 Suporte de CSV no SQL Server 2019 (15.x) necessário para Hadoop. No SQL Server 2022 (16.x) e versões posteriores, o CSV tem suporte nativo sem Hadoop.

3 Usa o conector do SQL Server (sqlserver://). A credencial no escopo do banco de dados tem como destino o ponto de extremidade do SQL do Azure, as mesmas etapas que a conexão com outro SQL Server.

Suporte para autenticação de Identidade Gerenciada 4 está disponível para conectar-se ao Armazenamento de Blobs do Azure (ABS) e ao ADLS Gen2. Ele requer o SQL Server com suporte para Azure Arc ou o SQL Server em uma VM do Azure para uso em SQL Server no local. Ele está disponível nativamente no Banco de Dados SQL do Azure e na Instância Gerenciada de SQL do Azure.

Observação

A partir do SQL Server 2025 (17.x), a consulta de arquivos de dados (CSV, Parquet e Delta) no Armazenamento de Blobs do Azure, no ADLS Gen2 ou no armazenamento compatível com S3 é uma funcionalidade do mecanismo nativo e não requer mais a instalação ou a execução de serviços do PolyBase. Os conectores RDBMS (SQL Server, Oracle, Teradata, MongoDB, ODBC) ainda exigem que os serviços do PolyBase sejam instalados e em execução. O SQL Server 2025 (17.x) também adiciona suporte ao Linux para esses conectores, que estavam disponíveis anteriormente apenas no Windows.

Consultar dados externos

Antes de escolher um cenário específico, entenda as três maneiras de consultar dados externos:

Abordagem Sintaxe Usar quando Autenticação PolyBase necessário
Consultas ad hoc do OLE DB OPENROWSET(provider, connection, query) Você deseja uma consulta única rápida sem objetos persistentes ou precisa da autenticação da ID do Microsoft Entra Autenticação SQL, Autenticação do Windows, Microsoft Entra ID (MSOLEDBSQL) No
Consultas ad hoc de arquivo OPENROWSET(BULK ...) Você deseja explorar dados de arquivo rapidamente ou testar esquemas antes de criar uma tabela Token SAS, chave de acesso, Identidade Gerenciada, ID do Microsoft Entra Sim para o Banco de Dados SQL do Azure e a Instância Gerenciada de SQL do Azure

Não se aplica a instâncias do SQL Server
Conectores de dados persistentes CREATE EXTERNAL TABLE com sqlserver://, oracle://, teradata:// etc. Você precisa de acesso recorrente, governança, estatísticas e computação otimizada para produção Somente autenticação SQL Sim

Os serviços do PolyBase são necessários para acesso a arquivos de nuvem no SQL Server 2019 (15.x) e no SQL Server 2022 (16.x). O SQL Server 2025 (17.x) e versões posteriores têm suporte nativo para CSV, Parquet e Delta sem PolyBase.

Guia de decisão

Scenario Recomendação
Preciso da autenticação da ID do Microsoft Entra para SQL remoto ou quero evitar serviços do PolyBase Usar OPENROWSET(MSOLEDBSQL, ...) (ad hoc, sem objetos persistentes)
Preciso de tabelas persistentes, estatísticas, ou de computação delegada para bancos de dados remotos Use CREATE EXTERNAL TABLE com conectores do PolyBase (sqlserver://, oracle://, teradata://, mongodb://, odbc://). OPENROWSET não dá suporte a conectores
Estou explorando um novo arquivo ou testando um esquema Uso OPENROWSET(BULK ...) (iteração rápida, sem objetos persistentes)
Estou importando dados de arquivo para tabela com transformações Utilizar INSERT ... SELECT a partir de OPENROWSET(BULK ...)
Preciso de governança ou acesso compartilhado para muitos usuários ou aplicativos Use CREATE EXTERNAL TABLE para que as permissões e os metadados sejam centralizados
Estou trabalhando no banco de dados SQL no Fabric Use OPENROWSET(BULK ...) para consultas ad hoc do OneLake ou tabelas externas para acesso reutilizável; para armazenamento externo, use atalhos do OneLake

Escolha seu cenário

Agora que você entende as três abordagens, use um dos guias a seguir para implementar seu caso de uso específico.

Arquivos de consulta (Parquet, CSV ou Delta)

Se os dados estiverem em arquivos Parquet, CSV ou Delta no Armazenamento de Blobs do Azure, no ADLS Gen2, no armazenamento compatível com S3 ou no OneLake, siga um destes guias:

Scenario Guia recomendado Plataformas
Consulta ad hoc rápida em um arquivo Parquet ou CSV Use OPENROWSET. Nenhuma tabela externa é necessária SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Fabric
Consultas repetidas em arquivos Parquet com um esquema persistente Criar uma tabela externa sobre Parquet SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Fabric
Consultar arquivos CSV com uma tabela externa Criar uma tabela externa com um formato de arquivo para texto delimitado SQL Server 2019 (15.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Fabric
Consultar tabelas do Delta Lake Criar uma tabela externa com FILE_FORMAT = DeltaLakeFileFormat SQL Server 2022 (16.x) e versões posteriores
Exportar resultados da consulta para arquivos Parquet ou CSV (CETAS) Utilize CREATE EXTERNAL TABLE AS SELECT SQL Server 2022 (16.x) e versões posteriores, Instância Gerenciada de SQL do Azure

Você também pode seguir um destes tutoriais passo a passo:

Tutorial Descrição
Introdução ao PolyBase no SQL Server 2022 Cobre OPENROWSET utilizando Parquet e CSV, tabelas externas e navegação entre pastas.
Virtualizar o arquivo Parquet em um armazenamento de objetos compatível com o S3 usando o PolyBase Tutorial para o SQL Server 2022 (16.x) e versões posteriores.
Virtualizar o arquivo CSV com o PolyBase Tutorial para o SQL Server 2022 (16.x) e versões posteriores.
Virtualizar tabela delta com o PolyBase Tutorial para o SQL Server 2022 (16.x) e versões posteriores.
Virtualização de dados com o Banco de Dados SQL do Azure (versão prévia) Guia do Banco de Dados SQL do Azure para Parquet e CSV.
Virtualização de dados com a Instância Gerenciada de SQL do Azure Guia da Instância Gerenciada de SQL do Azure para Parquet, CSV e CETAS.
Virtualização de dados em banco de dados SQL no Fabric Guia do banco de dados SQL no Fabric para arquivos OneLake.

Conectar-se a outra instância do SQL Server, o Banco de Dados SQL do Azure ou a Instância Gerenciada de SQL

No SQL Server 2019 (15.x) e versões posteriores, o PolyBase pode consultar tabelas em outra instância do SQL Server, banco de dados SQL do Azure ou Instância Gerenciada de SQL do Azure, sem usar servidores vinculados.

Importante

No banco de dados SQL no Fabric, não há suporte para o conector sqlserver://. Os conectores RDBMS do PolyBase utilizam autenticação SQL através de CREATE DATABASE SCOPED CREDENTIAL e não oferecem suporte à ID do Microsoft Entra, Identidade Gerenciada ou autenticação de entidade de serviço. Como o banco de dados SQL no Fabric requer autenticação do Microsoft Entra, você não pode se conectar a ele usando o PolyBase.

Etapa O que fazer
1. Instalar o PolyBase Instalar o PolyBase no Windows ou instalar o PolyBase no Linux
2. Criar uma credencial CREATE DATABASE SCOPED CREDENTIAL com o login de destino
3. Criar uma fonte de dados externa CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')
4. Criar uma tabela externa CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')
5. Consulta SELECT * FROM <external_table>

Dica

O conector do SQL Server (sqlserver://) também funciona para o Banco de Dados SQL do Azure e a Instância Gerenciada de SQL do Azure. Use as mesmas etapas e defina LOCATION para o ponto de extremidade do SQL do Azure (por exemplo, sqlserver://myserver.database.windows.net).

Para obter um guia detalhado, consulte Configurar o PolyBase para acessar dados externos no SQL Server.

Conectar-se ao Oracle, Teradata ou MongoDB

O SQL Server 2019 (15.x) e versões posteriores podem consultar bancos de dados Oracle, Teradata, MongoDB e Cosmos DB por meio de conectores ODBC do PolyBase.

Fonte de dados Guide Requisitos
Oracle Configurar o PolyBase para acessar dados externos no Oracle SQL Server 2019 (15.x) e versões posteriores, drivers de cliente Oracle
Teradata Configurar o PolyBase para acessar dados externos no Teradata SQL Server 2019 (15.x) e versões posteriores, driver ODBC do Teradata
MongoDB /Cosmos DB Configurar o PolyBase para acessar dados externos no MongoDB SQL Server 2019 (15.x) e versões posteriores, driver ODBC do MongoDB
Qualquer fonte ODBC Configurar o PolyBase para acessar dados externos com tipos genéricos ODBC SQL Server 2019 (15.x) e versões posteriores (Windows)

(Linux começando com o SQL Server 2025 (17.x))

Conectar-se ao Armazenamento de Blobs do Azure ou ao ADLS Gen2

Plataforma SQL Opções de autenticação Guide
SQL Server 2022 (16.x) e versões posteriores Token SAS, chave de acesso, Identidade Gerenciada (a partir do SQL Server 2025 (17.x)) Configurar o PolyBase para acessar dados externos no Armazenamento de Blobs do Azure
SQL Server 2019 (15.x) Chave de acesso (por meio do conector do Hadoop) Configurar o PolyBase para acessar dados externos no Armazenamento de Blobs do Azure
Banco de Dados SQL do Azure Token SAS, Identidade Gerenciada, passagem Microsoft Entra Virtualização de dados com o Banco de Dados SQL do Azure (versão prévia)
Instância Gerenciada de SQL do Azure Token SAS, Identidade Gerenciada Virtualização de dados com a Instância Gerenciada de SQL do Azure

No SQL Server 2022 (16.x), os prefixos de URI foram alterados. Ao migrar do SQL Server 2019 (15.x) ou versões anteriores:

  • Armazenamento de Blobs do Azure: alterar wasb[s]:// para abs://
  • ADLS Gen2: Alterar abfs[s]:// para adls://

Para obter mais informações, consulte Configurar o PolyBase para acessar dados externos no Armazenamento de Blobs do Azure.

Conectar-se ao armazenamento de objetos compatível com S3

O SQL Server 2022 (16.x) e versões posteriores dão suporte ao armazenamento compatível com S3, como Amazon S3, MinIO e Ceph.

Para obter mais informações, confira Configurar o PolyBase para acessar dados externos no armazenamento de objetos compatível com o S3.

Exportar dados com CREATE EXTERNAL TABLE AS SELECT (CETAS)

O CETAS exporta os resultados da consulta para arquivos externos (Parquet ou CSV) no Armazenamento de Blobs do Azure, no ADLS Gen2 ou no armazenamento compatível com S3.

Plataforma SQL Supported Formatos de exportação Observações
SQL Server 2022 (16.x) e versões posteriores Sim Parquet, CSV Requer a configuração do servidor: permitir a exportação de polybase
Instância Gerenciada de SQL do Azure Sim Parquet, CSV Desabilitado por padrão
Banco de Dados SQL do Azure No Nenhum Não disponível
Banco de dados SQL no Fabric No Nenhum Não disponível

Para obter a referência Transact-SQL, consulte CREATE EXTERNAL TABLE AS SELECT (CETAS).

Exemplos de início rápido

Exemplo 1: consulta ad hoc em um arquivo Parquet (OPENROWSET)

Nenhuma tabela externa é necessária. Funciona no SQL Server 2022 (16.x) e versões posteriores, no Banco de Dados SQL do Azure, na Instância Gerenciada de SQL do Azure e no Banco de Dados SQL no Fabric.

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

Exemplo 2: tabela externa em CSV no Azure Blob Storage

Este exemplo funciona em todas as plataformas SQL que dão suporte ao PolyBase.

  • Etapa 1: criar uma DMK (chave mestra de banco de dados). Essa etapa é necessária porque a credencial armazena um segredo de token SAS. No entanto, você poderá usar essa etapa se usar a Identidade Gerenciada ou a autenticação do Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>';
    
  • Etapa 2: criar uma credencial com um token SAS. Omita o inicial ?.

    CREATE DATABASE SCOPED CREDENTIAL MyStorageCred
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
         SECRET = '<your_SAS_token>'; -- omit the leading '?'
    
  • Etapa 3: criar uma fonte de dados externa.

    CREATE EXTERNAL DATA SOURCE MyAzureStorage
    WITH (
        LOCATION = 'abs://mycontainer@mystorageaccount.blob.core.windows.net',
        CREDENTIAL = MyStorageCred
    );
    
  • Etapa 4: criar um formato de arquivo para o CSV.

    CREATE EXTERNAL FILE FORMAT CsvFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (
            FIELD_TERMINATOR = ',',
            STRING_DELIMITER = '"',
            FIRST_ROW = 2
        )
    );
    
  • Etapa 5: Criar a tabela 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
    );
    
  • Etapa 6: Consultar a tabela externa.

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

Exemplo 3: consultar uma tabela em outro SQL Server

Este exemplo funciona no SQL Server 2019 (15.x) e versões posteriores.

  • Etapa 1: criar uma chave mestra de banco de dados (necessária porque a credencial armazena uma senha).

    CREATE MASTER KEY ENCRYPTION
    BY PASSWORD = '<strong_password>';
    
  • Etapa 2: criar uma credencial para a instância remota do SQL Server.

    CREATE DATABASE SCOPED CREDENTIAL RemoteSqlCred
    WITH IDENTITY = 'remote_user',
         SECRET = '<password>';
    
  • Etapa 3: criar a fonte de dados externa.

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • Etapa 4: Criar a tabela externa (nome em três partes no 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'
    );
    
  • Etapa 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;
    

Exemplo 4: Exportar resultados para Parquet com CETAS

Funciona no SQL Server 2022 (16.x) e em versões posteriores, Instância Gerenciada de SQL do Azure.

  • Etapa 1: Habilitar o CETAS (somente SQL Server).

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • Etapa 2: criar credencial e fonte de dados (reutilizar de exemplos anteriores).

  • Etapa 3: Criar um formato de arquivo para exportação Parquet.

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • Etapa 4: Exportar resultados da 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';
    

Blocos de construção T-SQL para PolyBase

Antes de implementar qualquer cenário, entenda os principais objetos T-SQL que o PolyBase usa e como eles se encaixam:

Diagrama mostrando o PolyBase Transact-SQL objetos e suas relações.

Diagrama mostrando objetos T-SQL do PolyBase e suas relações, desde autenticação (chave mestra de banco de dados, credenciais) até fontes de dados e formatos de arquivo até métodos de consulta (External Table, OPENROWSET, BULK INSERT, CETAS).

Para obter informações sobre essas instruções T-SQL, consulte:

Para obter uma referência de Transact-SQL completa para todos os objetos, consulte a referência de Transact-SQL PolyBase.

Importante

Verifique o mapeamento de tipo de dados para o formato de arquivo externo. Quando você cria um formato de arquivo externo ou arquivos de consulta usando OPENROWSET, o PolyBase mapeia automaticamente os tipos de dados de origem (Parquet, CSV, Delta, Oracle, Teradata, MongoDB) para tipos de dados do SQL Server. Tipos incompatíveis podem causar truncamento silencioso, perda de precisão ou erros de consulta. Por exemplo, um Parquet DECIMAL(38,18) mapeia para DECIMAL(18,0). Examine as tabelas de mapeamento antes de definir colunas de tabela externas ou uma WITH cláusula. Para obter a referência completa, consulte Mapeamento de tipo com o PolyBase.

Quando CREATE MASTER KEY é necessário?

Uma chave mestra de banco de dados (DMK) é criada usando a sintaxe CREATE MASTER KEY. O DMK criptografa os segredos armazenados dentro das credenciais com escopo de banco de dados. Ela é necessária somente quando a credencial contém um valor secreto, ou seja, quando armazena uma senha, um token ou uma chave de acesso.

  • O DMK é necessário (a credencial armazena um segredo):

    Tipo de autenticação Valor IDENTITY Tem segredo DMK
    token SAS 'SHARED ACCESS SIGNATURE' Sim Obrigatório
    Chave de acesso S3 'S3 ACCESS KEY' Sim Obrigatório
    Logon do SQL/autenticação básica '<username>' Sim Obrigatório
    Chave de acesso da conta de armazenamento '<storage_account_name>' Sim Obrigatório
  • O DMK não é necessário (nenhum segredo armazenado):

    Tipo de autenticação Valor IDENTITY Tem segredo DMK
    Identidade Gerenciada 'Managed Identity' No Não é necessário
    Microsoft Entra ID 'User Identity' ou 'Managed Identity' No Não é necessário

Dica

Se não houver segredo em sua CREATE DATABASE SCOPED CREDENTIAL declaração, você não precisará de um DMK. A Identidade Gerenciada e a autenticação do Microsoft Entra ID delegam confiança à plataforma. O banco de dados não armazena senhas ou tokens.

Exemplos:

Nesta consulta de exemplo, o DMK é necessário (a Credencial armazena um token SAS).

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

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

Nesta consulta de exemplo, o DMK não é necessário (Identidade Gerenciada, sem segredo).

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

Nesta consulta de exemplo, o DMK não é necessário (autenticação por passagem do Microsoft Entra, sem necessidade de chave secreta).

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

Acesso a dados remotos com OPENROWSET e tabelas externas

O SQL Server oferece três abordagens distintas para consultar dados remotos. Você pode escolher a abordagem certa ao entender as diferenças de sintaxe, autenticação e arquitetura.

Abordagem Sintaxe Conecta-se a Autenticação Serviços do PolyBase Plataformas
Consultas OLE DB OPENROWSET(provider, connection, query) Qualquer fonte OLE DB por meio de MSOLEDBSQL, SQLOLEDB ou outros provedores Autenticação SQL, Autenticação do Windows, Microsoft Entra ID (MSOLEDBSQL) No SQL Server (todas as versões com suporte)
Consultas de arquivo OPENROWSET(BULK ...) Arquivos em disco local, rede ou nuvem (Blob do Azure, ADLS, S3, OneLake) Token SAS, chave de acesso, Identidade Gerenciada, ID do Microsoft Entra Sim para nuvem*; Não para local SQL Server 2005; SQL Server 2022 (16.x) e versões posteriores (nuvem); Azure SQL
Conectores do PolyBase CREATE EXTERNAL TABLE com CREATE EXTERNAL DATA SOURCE usando sqlserver://, oracle://, teradata://, mongodb://, odbc:// Fontes remotas do SQL Server, Oracle, Teradata, MongoDB e ODBC Somente autenticação SQL Sim SQL Server 2019 (15.x) e versões posteriores (Windows); SQL Server 2025 (17.x) e versões posteriores (Linux)

Os serviços do PolyBase são necessários para acesso a arquivos de nuvem no SQL Server 2019 (15.x) e no SQL Server 2022 (16.x). O SQL Server 2025 (17.x) e versões posteriores têm suporte de arquivo de nuvem nativo e não exigem mais o PolyBase para CSV, Parquet ou Delta.

Quando usar cada abordagem

Use OLE DB OPENROWSET para:

  • Consultas ad hoc rápidas sem criar objetos persistentes
  • Microsoft Entra ID ou autenticação de Identidade Gerenciada (via MSOLEDBSQL)
  • Evitando dependências de serviço do PolyBase
  • Conectar a qualquer fonte de dados com um provedor OLE DB

Use o arquivo OPENROWSET(BULK) para:

  • Exploração de arquivo ad hoc e descoberta de esquema
  • Transformações e visualizações rápidas antes de se comprometer com uma definição de tabela
  • Transformações de coluna flexíveis embutidas (conversão, filtragem, colunas computadas)
  • Dados que não mudam com frequência e não precisam de metadados persistentes

Use conectores do PolyBase com CREATE EXTERNAL TABLE para:

  • Definições de tabela persistentes e reutilizáveis acessadas por vários usuários ou aplicativos
  • Cargas de trabalho de produção que exigem estatísticas e otimização de plano de consulta
  • Cálculo por push para fontes remotas (filtros enviados por push para Oracle, SQL Server etc.)
  • Governança e segurança compartilhadas (uma vez criadas, os usuários só precisam de SELECT permissão)
  • Quando você tem a autenticação SQL disponível para a origem remota

OPENROWSET (OLE DB) – consultas remotas ad hoc (não requer serviços do PolyBase)

A forma OLE DB conecta a uma fonte de dados remota OPENROWSET por meio de um provedor OLE DB, executa uma consulta pass-through e retorna os resultados como um conjunto de linhas. É uma alternativa ad hoc única para um servidor vinculado. Nenhum metadado persistente é criado. Essa sintaxe não requer serviços do PolyBase e não dá suporte a arquivos de nuvem ou fontes de dados externas.

Esta consulta de exemplo se conecta a um SQL Server remoto por meio do OLE DB (não do PolyBase).

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

OPENROWSET(BULK) – consultas baseadas em arquivo (PolyBase)

A BULK forma de OPENROWSET lê dados diretamente dos arquivos. No SQL Server 2019 (15.x) e versões anteriores, ele lê de caminhos de arquivo local ou UNC e requer um arquivo de formato. No SQL Server 2022 (16.x) e versões posteriores, você pode ler do armazenamento em nuvem usando os parâmetros DATA_SOURCE e FORMAT. Essa abordagem é a versão integrada do PolyBase usada para virtualização de dados.

No contexto do PolyBase e da virtualização de dados, quando este guia se refere a OPENROWSET, isso significa a sintaxe OPENROWSET(BULK ...) com a cláusula FORMAT para consultar arquivos externos.

Exemplos:

Esta consulta de exemplo lê um arquivo Parquet do Armazenamento de Blobs do Azure (SQL Server 2022 e versões posteriores).

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

Esta consulta de exemplo lê um arquivo Parquet com um caminho embutido (Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure).

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

Quando usar OPENROWSET versus tabelas externas

Ambas as tabelas externas e OPENROWSET(BULK ...) permitem consultar dados externos com T-SQL, mas são projetadas para diferentes casos de uso. A tabela a seguir resume as principais diferenças para ajudá-lo a decidir qual abordagem se encaixa em seu cenário.

Capacidade OPENROWSET(BULK ...) Tabela externa
Purpose Exploração ad hoc e consultas únicas Definição de tabela persistente e reutilizável
Metadados armazenados no banco de dados Não. Nada é salvo após a execução da consulta Sim. A definição de tabela, a fonte de dados e o formato de arquivo são armazenados como objetos de banco de dados
Definição de esquema Inferido automaticamente do arquivo (Parquet) ou especificado diretamente com uma cláusula WITH. Definido explicitamente na declaração CREATE EXTERNAL TABLE
Permissões ADMINISTER BULK OPERATIONS Requer ouADMINISTER DATABASE BULK OPERATIONS Depois de a tabela ser criada, a permissão padrão SELECT é suficiente.
Colunas computadas Sim. Adicione expressões e colunas computadas na lista SELECT; as funções de metadados como filename() e filepath() só estão disponíveis aqui. Não. Lista de colunas fixa; executar transformações em uma exibição ou na consulta que lê a tabela externa
Estatísticas SQL do Azure: estatísticas manuais de coluna única por meio de sys.sp_create_openrowset_statistics; SQL Server 2022 (16.x) e versões posteriores: criar estatísticas automaticamente em predicados (sem estatísticas manuais no SQL Server). Confira as estatísticas manuais do OPENROWSET. Suporte completo CREATE STATISTICS em todas as plataformas, além de criar automaticamente no SQL Server 2022 (16.x) e versões posteriores. Consulte Criar estatísticas manuais de tabela externa.
Pushdown Suporte limitado. O mecanismo pode otimizar filtros para a varredura de arquivo, mas não há otimização de filtro para fontes remotas de SGBD. Sim. Dá suporte à computação pushdown para conectores RDBMS (SQL Server, Oracle, Teradata, MongoDB)
Mais adequado para Exploração de dados, descoberta de esquema, consultas de protótipo, cargas de dados únicos, transformações flexíveis Cargas de trabalho de produção, consultas repetidas, acesso compartilhado entre usuários, dashboards e relatórios

Usar OPENROWSET quando precisar de flexibilidade

Use OPENROWSET para explorar um arquivo, testar esquemas diferentes ou adicionar colunas e transformações computadas sem criar objetos persistentes. Por exemplo, você pode extrair o caminho do arquivo como uma coluna, converter tipos de dados diretamente ou filtrar com base em expressões computadas em uma única consulta.

Esta consulta de exemplo inclui colunas computadas e transformações:

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

Dica

As funções filepath() e filename() estão disponíveis no Banco de Dados SQL do Azure, na Instância Gerenciada do Azure SQL e no SQL Server 2022 (16.x) e versões posteriores. Eles permitem filtrar partes do caminho do arquivo (eliminação de partição) e expor o nome do arquivo de origem como uma coluna, o que não é diretamente possível com tabelas externas.

Utilize tabelas externas quando precisar de persistência e governança

Use tabelas externas quando vários usuários ou aplicativos precisarem consultar os mesmos dados externos repetidamente. Você define o esquema, a fonte de dados e as credenciais uma vez e as armazena no banco de dados. Os consumidores apenas necessitam de SELECT permissão na tabela.

Tabelas externas também dão suporte a estatísticas, que o otimizador de consulta usa para criar planos de execução melhores. Você pode criar estatísticas manualmente ou permitir que o mecanismo as crie automaticamente (SQL Server 2022 (16.x) e versões posteriores).

Esta consulta de exemplo cria estatísticas em uma tabela externa para melhores planos de consulta.

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

Para obter mais informações sobre estatísticas para ambas as abordagens, consulte considerações de desempenho do PolyBase – Estatísticas.

BULK INSERT vs. OPENROWSET(BULK): Qual deve ser usado?

Ambos BULK INSERT e OPENROWSET(BULK ...) importam dados de arquivos para o SQL Server utilizando o mesmo mecanismo subjacente de carregamento em massa. No entanto, elas diferem em sintaxe, flexibilidade e o que você pode fazer com os resultados. A tabela a seguir resume as principais diferenças:

Observação

BULK INSERT não está disponível no banco de dados SQL no Fabric. Para o Fabric, use OPENROWSET(BULK ...) contra o OneLake.

Capacidade BULK INSERT OPENROWSET(BULK ...)
Finalidade básica Carrega dados de um arquivo diretamente em uma tabela de destino Retorna um conjunto de linhas que você usa em uma instrução SELECT ou INSERT ... SELECT
Padrão de uso Instrução autônoma: BULK INSERT <table> FROM '<file>' Deve ser usado dentro de uma consulta: SELECT * FROM OPENROWSET(BULK ...) ou INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)
Requer uma tabela de destino? Sim. Sempre escreve diretamente em uma tabela Não. Você pode SELECT a partir dele sem inserir em qualquer lugar ou inserir em qualquer tabela ou tabela temporária
Transformações de coluna durante a carga Suporte limitado. Os dados fluem de arquivo para tabela 'as-is' (mapeamento controlado por arquivo de formato ou ordem de coluna) Suporte completo. Você pode adicionar expressões, CASTWHERE filtros, JOIN outras tabelas e colunas computadas ao redorSELECT
Sugestões de tabela A WITH cláusula inclui suporte para BATCHSIZE, , CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCKe muito mais Dá suporte a dicas de tabela por meio da INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...) sintaxe
Importação de valor único de objeto grande (LOB) Sem suporte Sim. Suporta SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB para importar um arquivo inteiro como um valor varbinary(max), varchar(max), ou nvarchar(max)
Formatar arquivos Sim. Com suporte por meio de (XML e formatos não XML) Sim. Com suporte (XML e não XML)
Acesso a arquivos na nuvem (Armazenamento de Blobs do Azure, ADLS Gen2, S3) Sim. Suportado por meio do parâmetro DATA_SOURCE (SQL Server 2017 (14.x) e versões posteriores, do Azure SQL) Sim. Com suporte via parâmetro DATA_SOURCE ou URL in-line com cláusula FORMAT (SQL Server 2022 (16.x) e versões posteriores, Azure SQL)
Arquivos Parquet ou Delta Sem suporte. Somente texto CSV/delimitado Sim. Com suporte com FORMAT = 'PARQUET' ou FORMAT = 'DELTA' (SQL Server 2022 (16.x) e versões posteriores, SQL do Azure)
Permissão necessária ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, mais INSERT na tabela de destino ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS
Registro em log mínimo Sim. Modelos de recuperação simples ou registrados em massa com suporte em TABLOCK Sim. Com suporte quando usado com INSERT ... SELECT e TABLOCK

Quando escolher BULK INSERT

Use BULK INSERT quando você tiver uma carga simples de arquivo para tabela e não precisar transformar, filtrar ou unir dados durante a importação. Ele usa uma sintaxe mais simples para CSV ou outros arquivos delimitados:

Esta consulta de exemplo carrega um arquivo CSV do Armazenamento de Blobs do Azure diretamente em uma tabela.

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

Esta consulta de exemplo carrega um arquivo local com um arquivo de formato para mapeamento de coluna.

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

Quando escolher OPENROWSET(BULK)

Use OPENROWSET(BULK ...) quando precisar de uma ou mais das seguintes condições:

  • Consultar ou visualizar dados de arquivo sem criar uma tabela primeiro.
  • Transformar, filtrar ou unir dados durante a importação.
  • Carregue arquivos Parquet ou Delta (só OPENROWSET dá suporte a esses formatos).
  • Importar um arquivo inteiro como um único valor LOB (SINGLE_BLOB, SINGLE_CLOB, ). SINGLE_NCLOB

Esta consulta de exemplo visualiza um arquivo CSV do Armazenamento de Blobs do Azure sem inserir os dados em qualquer lugar.

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

Esta consulta de exemplo insere dados com transformação e filtragem.

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 exemplo carrega um arquivo Parquet (não é possível com BULK INSERT).

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

Esta consulta de exemplo importa um arquivo XML inteiro como um único valor varbinary(max ).

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

Dica

Uma abordagem é começando com OPENROWSET(BULK ...) para SELECT explorar e validar dados de arquivo e alternando para BULK INSERT para a carga de produção final se você não precisar de transformações. Se você precisar de suporte Parquet ou Delta ou de filtragem embutida, fique com OPENROWSET.

Para obter mais informações, consulte os seguintes guias relacionados:

Funções de metadados úteis

Ao consultar arquivos externos com ou tabelas OPENROWSET externas, você pode usar várias funções internas e procedimentos para inspecionar metadados de arquivo, descobrir esquemas e implementar consultas com reconhecimento de partição.

filepath() e filename()

As funções filepath() e filename() retornam partes do caminho ou do nome do arquivo para cada linha no conjunto de resultados. Eles são especialmente úteis para:

  • Eliminação de partição: filtre em segmentos de pasta (por exemplo, partições de ano/mês/dia) para que o mecanismo leia apenas os arquivos correspondentes em vez de verificar tudo.

  • Expondo metadados de origem: inclua o nome ou o caminho do arquivo de origem como uma coluna nos resultados da consulta, o que é útil para auditoria ou depuração.

Função Devoluções Exemplo
filename() O nome do arquivo (incluindo a extensão) do arquivo de origem para cada linha sales_2025_01.parquet
filepath(N) O Nº segmento de pasta a partir do curinga (*) no caminho BULK, no qual N começa em 1 Para caminho sales/2025/01/*.parquet, filepath(1) retorna 2025, filepath(2) retorna 01

Aplica-se a: Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, SQL Server 2022 (16.x) e versões posteriores, banco de dados SQL no Fabric.

Este exemplo de consulta usa filepath() para eliminação de partição e filename() para identificar arquivos de origem. Ele lê apenas arquivos na /2025/ pasta e lê apenas arquivos na /06/ subpasta.

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

Dica

Coloque filepath() filtros na WHERE cláusula ao invés de em uma subconsulta ou CTE. Quando o filtro está na WHERE cláusula, o mecanismo pode executar a eliminação de partição no nível de verificação de arquivo, o que reduz significativamente a E/S.

sp_describe_first_result_set – identificar tipos de coluna do OPENROWSET

Quando você usa OPENROWSET com arquivos Parquet, o mecanismo infere os tipos de dados de coluna automaticamente (inferência de esquema). Os tipos inferidos podem ser maiores do que o necessário. Por exemplo, as colunas de caractere geralmente são inferidas como varchar(8000) porque os metadados Parquet não incluem um comprimento máximo. Essa opção pode prejudicar o desempenho e consumir mais memória.

Use sp_describe_first_result_set para inspecionar o esquema inferido antes de finalizar sua consulta. Depois de ver os tipos inferidos, especifique tipos mais estreitos em uma WITH cláusula para melhorar o desempenho.

  • Etapa 1: inspecione o 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';
    

    A saída mostra o nome de cada coluna, o tipo de dados inferido, o comprimento máximo, a precisão e a escala. Se você vir varchar(8000) em que um varchar(100) seria suficiente, substitua-o:

  • Etapa 2: use tipos explícitos para melhorar o desempenho.

    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;
    

A inferência de esquema só funciona com arquivos Parquet. Para arquivos CSV, sempre especifique definições de coluna, seja em uma cláusula WITH (para OPENROWSET), ou na declaração CREATE EXTERNAL TABLE. sp_describe_first_result_set é um procedimento geral do SQL Server e do SQL do Azure, mas é especialmente útil para OPENROWSET consultas. Para mais informações, consulte sp_describe_first_result_set.

Desempenho, solução de problemas e práticas recomendadas

Depois de implementar a virtualização de dados, use estes guias para otimizar o desempenho, diagnosticar problemas e garantir a preparação para a produção:

Area Artigo Detalhes
Desempenho do PolyBase Considerações de desempenho no PolyBase para SQL Server Estatísticas, pushdown, paralelismo e gerenciamento de memória
Computação por pushdown Cálculos de empilhamento no PolyBase Especifica quais operações de push são enviadas para a fonte remota
Como saber se houve pushdown Como saber se ocorreu um rebaixamento externo Planos de consulta e DMVs
Solução de problemas Monitorar e solucionar problemas do PolyBase Erros e resoluções comuns
Conectividade Kerberos Solucionar problemas de conectividade do PolyBase Kerberos
perguntas frequentes Perguntas frequentes sobre o PolyBase
Erros e soluções Erros do PolyBase e possíveis soluções