Conectar, consultar e exportar dados com o PolyBase

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Banco de Dados SQL do AzureInstância Gerenciada de SQL do AzureSQL 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. 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.

Suporte da plataforma

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 de arquivos reutilizáveis para BI ou 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
  • Para exploração de arquivos ad hoc, use OPENROWSET(BULK ...) para inspecionar arquivos sem criar uma tabela reutilizável.
  • Para consultas de arquivos reutilizáveis em BI ou cenários de relatórios, use tabelas externas em vez de arquivos para persistir um esquema e compartilhar resultados entre consultas.
  • Para consultas entre bancos de dados, use conectores PolyBase com tabelas externas para acessar fontes do SQL Server, Oracle, Teradata, MongoDB ou ODBC.
  • Para exportar resultados de consulta para arquivos, use CREATE EXTERNAL TABLE AS SELECT (CETAS) para escrever saídas em Parquet ou CSV fora do banco de dados.
  • Para ingestão em massa em tabelas, use BULK INSERT ou OPENROWSET(BULK ...) com INSERT ... SELECT para carregar dados de arquivos em tabelas de banco de dados.

Quais recursos estão disponíveis onde?

A tabela a seguir mostra quais recursos centrais do PolyBase e virtualização de dados estão disponíveis em cada plataforma SQL a partir do SQL Server 2019. Para disponibilidade de recursos no SQL Server 2016 e no SQL Server 2017 no Windows, veja recursos e limitações do PolyBase. 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 Sim 5 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
Cálculo de aplicação 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 com escopo de banco de dados tem como alvo o endpoint SQL. Use os mesmos passos que para conectar a outra instância do SQL Server.

4 A Autenticação de Identidade Gerenciada é compatível com a conexão com o Armazenamento de blobs do Azure (ABS) e o 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.

5 SQL Server 2019 CU11 e versões posteriores dão suporte ao Azure Data Lake Storage Gen2 com o prefixo abfs ou abfss. No SQL Server 2022 e versões posteriores, use o adls prefixo.

  • Tabelas externas são suportadas no SQL Server 2019, SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Microsoft Fabric.
  • OPENROWSET (BULK)é suportado no SQL Server 2019, SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Microsoft Fabric. O SQL Server 2019 suporta caminhos de arquivos locais e de rede, enquanto o SQL Server 2022 e versões posteriores também suportam leitura de armazenamento em nuvem com FORMAT = 'PARQUET', FORMAT = DELTA, e FORMAT = 'CSV'.
  • A exportação do CETAS não é suportada no SQL Server 2019, Banco de Dados SQL do Azure ou SQL Database no Microsoft Fabric. A exportação CETAS é suportada no SQL Server 2022, SQL Server 2025 e Instância Gerenciada de SQL do Azure.
  • CSV e arquivos delimitados são suportados no SQL Server 2019, SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Microsoft Fabric. O SQL Server 2019 requer Hadoop para suporte a CSV, enquanto o SQL Server 2022 e versões posteriores suportam CSV nativamente sem Hadoop.
  • Arquivos Parquet não são suportados no SQL Server 2019. Os arquivos Parquet são suportados no SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e no banco de dados SQL no Microsoft Fabric.
  • As tabelas Delta Lake não são suportadas no SQL Server 2019, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure ou SQL Database no Microsoft Fabric. As tabelas Delta Lake são suportadas no SQL Server 2022 e no SQL Server 2025.
  • A conexão a outra instância do SQL Server é suportada no SQL Server 2019, SQL Server 2022 e SQL Server 2025. Não há suporte para conexão com outra instância do SQL Server no Banco de Dados SQL do Azure, no Instância Gerenciada de SQL do Azure nem em um banco de dados SQL no Microsoft Fabric.
  • A conexão ao Banco de Dados SQL do Azure ou Instância Gerenciada de SQL do Azure é suportada pelo SQL Server 2019, SQL Server 2022 e SQL Server 2025 usando o conector SQL Server. A credencial com escopo de banco de dados tem como alvo o endpoint Banco de Dados SQL do Azure ou Instância Gerenciada de SQL do Azure, e as etapas de configuração são as mesmas que para conectar a outra instância do SQL Server. Essas conexões não são suportadas pelo Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure ou SQL Database no Microsoft Fabric.
  • A conexão com Oracle, Teradata ou MongoDB é suportada a partir do SQL Server 2019, SQL Server 2022 e SQL Server 2025. Essas conexões não são suportadas pelo Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure ou SQL Database no Microsoft Fabric.
  • A conexão com o Armazenamento de Blobs do Azure é suportada pelo SQL Server 2019, SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure. Conectar ao Armazenamento de Blobs do Azure não é suportado pelo banco de dados SQL no Microsoft Fabric.
  • Conectar ao ADLS Gen2 não é suportado nas versões do SQL Server 2019 anteriores ao CU11 nem a partir do banco de dados SQL no Microsoft Fabric. A conexão com ADLS Gen2 é suportada a partir do SQL Server 2019 CU11, e no SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure.
  • A conexão com armazenamento compatível com S3 não tem suporte no SQL Server 2019, no Banco de Dados SQL do Azure, no Instância Gerenciada de SQL do Azure nem no Banco de Dados SQL no Microsoft Fabric. A conexão com armazenamento compatível com S3 é suportada a partir do SQL Server 2022 e SQL Server 2025.
  • A conexão ao OneLake é suportada a partir de banco de dados SQL no Microsoft Fabric. Conectar ao OneLake não é suportado pelo SQL Server 2019, SQL Server 2022, SQL Server 2025, Banco de Dados SQL do Azure ou Instância Gerenciada de SQL do Azure.
  • A computação pushdown é suportada no SQL Server 2019, SQL Server 2022 e SQL Server 2025. O cálculo por pressão não é suportado no Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure ou SQL Database no Microsoft Fabric.
  • A autenticação por Identidade Gerenciada não é suportada no SQL Server 2019 ou no SQL Server 2022. A autenticação por Identidade Gerenciada tem suporte no SQL Server 2025 para conexões com o Armazenamento de Blobs do Azure e o ADLS Gen2, e requer o SQL Server habilitado para Azure Arc ou o SQL Server em uma máquina virtual do Azure. A autenticação por Identidade Gerenciada também é suportada no Banco de Dados SQL do Azure e no Instância Gerenciada de SQL do Azure, mas não é suportada no banco de dados SQL do Microsoft Fabric.

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 Instalação do PolyBase necessária
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 em arquivos 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 SQL Server 2022: Sim 1

SQL Server 2025 e versões posteriores: Não

Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e SQL Database em Fabric: Incorporados
Conectores de dados persistentes CREATE EXTERNAL TABLE com sqlserver://, oracle://, teradata:// etc. Você precisa de acesso recorrente, governança, estatísticas e computação de pushdown para produção Somente autenticação SQL Sim

1 Para acesso a arquivos na nuvem no SQL Server 2022 (16.x), você deve instalar o recurso PolyBase, mas os conectores de armazenamento Armazenamento de Blobs do Azure, ADLS Gen2 e compatíveis com S3 não dependem dos serviços PolyBase. SQL Server 2025 (17.x) e versões posteriores possuem suporte nativo para CSV, Parquet e Delta sem necessidade de instalar ou rodar serviços PolyBase.

  • Consultas ad hoc do OLE DB são usadas OPENROWSET(provider, connection, query) para acesso rápido e único a uma fonte de dados remota sem criar objetos persistentes. Eles podem usar autenticação SQL, autenticação do Windows ou Microsoft Entra ID com MSOLEDBSQL. Esse cenário não exige instalação do PolyBase.
  • Consultas ad hoc em arquivos são usadas OPENROWSET(BULK ...) para explorar rapidamente os dados do arquivo ou testar um esquema antes de criar uma tabela. Eles podem usar tokens SAS, chaves de acesso, Identidade Gerenciada ou Microsoft Entra ID. O SQL Server 2022 exige a instalação do recurso PolyBase para arquivos na nuvem, mas não exige serviços PolyBase. SQL Server 2025 e versões posteriores não exigem PolyBase para arquivos na nuvem. As consultas ad hoc em arquivos estão incorporadas ao Banco de Dados SQL do Azure, ao Instância Gerenciada de SQL do Azure e ao SQL database no Fabric.
  • Conectores de dados persistentes utilizam CREATE EXTERNAL TABLE com sqlserver://, oracle://, teradata:// e locais semelhantes para acesso recorrente, governança, estatísticas e processamento pushdown em cargas de trabalho de produção. Eles exigem autenticação SQL e serviços PolyBase.

Guia de decisão

Scenario Recomendação
É necessária a autenticação do Microsoft Entra ID para SQL remoto, ou você deseja evitar os serviços PolyBase. Use OPENROWSET(MSOLEDBSQL, ...) (ad hoc, sem objetos persistentes).
Você precisa de tabelas persistentes, estatísticas ou processamento delegado a bancos de dados remotos. Use CREATE EXTERNAL TABLE com conectores do PolyBase (sqlserver://, oracle://, teradata://, mongodb://, odbc://). OPENROWSET Não suporta conectores.
Você está explorando um novo arquivo ou testando um esquema. Use OPENROWSET(BULK ...) (iteração rápida, sem objetos persistentes).
Você está importando dados de um arquivo para uma tabela com transformações. Use INSERT ... SELECT de OPENROWSET(BULK ...).
Você precisa de governança ou acesso compartilhado para muitos usuários ou aplicativos. Use CREATE EXTERNAL TABLE para que permissões e metadados sejam centralizados.
Você está trabalhando em banco de dados SQL no Fabric. Use OPENROWSET(BULK ...) para consultas ad hoc no OneLake ou tabelas externas para acesso reutilizável; para armazenamento externo, use atalhos do OneLake.
  • Se você precisar de autenticação do Microsoft Entra ID para SQL remoto ou quiser evitar os serviços do PolyBase, use OPENROWSET(MSOLEDBSQL, ...) para consultas remotas ad hoc sem objetos persistentes.
  • Se você precisar de tabelas persistentes, estatísticas ou processamento pushdown em bancos de dados remotos, use CREATE EXTERNAL TABLE com conectores PolyBase como sqlserver://, oracle://, teradata://, mongodb:// e odbc://. OPENROWSET Não suporta esses conectores.
  • Se você estiver explorando um novo arquivo ou testando um esquema, use OPENROWSET(BULK ...) para iteração rápida e sem objetos persistentes.
  • Se você estiver carregando dados de um arquivo em uma tabela com transformações, use INSERT ... SELECT de OPENROWSET(BULK ...).
  • Se você precisar de governança ou acesso compartilhado para muitos usuários ou aplicativos, use CREATE EXTERNAL TABLE para que as permissões e os metadados fiquem centralizados.
  • Se você trabalha com um banco de dados SQL no Fabric, use OPENROWSET(BULK ...) para consultas ad hoc no OneLake ou tabelas externas para acesso reutilizável, e use atalhos do OneLake para armazenamento externo.

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
  • Para uma consulta rápida e ad hoc em um arquivo Parquet ou CSV, use OPENROWSET. Esse método não requer uma mesa externa. SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e SQL Database no Fabric suportam esse padrão.
  • Para consultas repetidas em arquivos Parquet com um esquema persistente, use 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 e SQL Database no Fabric suportam esse padrão.
  • Para uma consulta em arquivos CSV, use 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 e SQL Database no Fabric suportam esse padrão.
  • Para consultar tabelas Delta Lake, use uma tabela externa com FILE_FORMAT = DeltaLakeFileFormat. SQL Server 2022 (16.x) e versões posteriores suportam esse padrão.
  • Para exportar resultados de consulta para arquivos Parquet ou CSV, use CREATE EXTERNAL TABLE AS SELECT. O SQL Server 2022 (16.x) e versões posteriores e o Instância Gerenciada de SQL do Azure suportam esse padrão.

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 PolyBase RDBMS usam autenticação SQL através de CREATE DATABASE SCOPED CREDENTIAL e não oferecem suporte à autenticação via Microsoft Entra ID, Identidade Gerenciada ou 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 logon 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>
    1. Instale o PolyBase no Windows ou Linux usando o Install PolyBase no Windows ou Instale o PolyBase no Linux antes de configurar o acesso a dados SQL externos.
    1. Crie uma credencial com escopo de banco de dados com o login alvo usando CREATE DATABASE SCOPED CREDENTIAL para que o motor possa autenticar no servidor remoto.
    1. Crie uma fonte de dados externa para o SQL Server remoto usando CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>').
    1. Crie uma tabela externa usando CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>') para representar a tabela remota.
    1. Consulte a tabela externa usando 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 os mesmos passos e defina LOCATION para o endpoint Banco de Dados SQL do Azure ou Instância Gerenciada de 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. Exportar para ADLS Gen2 com CETAS requer SQL Server 2022 CU5 ou versão posterior. Sim Parquet, CSV Requer configuração do servidor: permitir 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
  • O SQL Server 2022 e versões posteriores suportam CETAS e exportam arquivos Parquet e CSV. A configuração do servidor: permitir exportação do PolyBase é necessária. A exportação CETAS para ADLS Gen2 não está disponível nas versões do SQL Server 2022 antes do CU5.
  • Instância Gerenciada de SQL do Azure suporta CETAS e exporta arquivos Parquet e CSV. A orientação Desabilitado por padrão descreve o estado padrão.
  • Banco de Dados SQL do Azure não suporta CETAS.
  • O banco de dados SQL no Fabric não suporta CETAS.

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 Armazenamento de Blobs do Azure

Este exemplo funciona em todas as plataformas SQL que suportam tabelas externas sobre arquivos CSV.

  • 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ê pode pular essa etapa se usar a autenticação Managed Identity ou Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<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 = '<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 (Tabela Externa, OPENROWSET, BULK INSERTCETAS).

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 você precisa de CREATE MASTER KEY?

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
    • Uma credencial de token SAS usa IDENTITY = 'SHARED ACCESS SIGNATURE' e armazena um valor secreto, então requer uma chave mestra do banco de dados.
    • Uma credencial de chave de acesso S3 usa IDENTITY = 'S3 ACCESS KEY' e armazena um valor secreto, então requer uma chave mestra de banco de dados.
      • Um login SQL ou credencial básica de autenticação usa IDENTITY = '<username>' e armazena um valor secreto, então requer uma chave mestra de banco de dados.
    • Uma credencial de chave de acesso de conta de armazenamento usa IDENTITY = '<storage_account_name>' e armazena um valor secreto, então requer uma chave mestra de banco de dados.
  • 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
    • Uma credencial de Identidade Gerenciada não usa IDENTITY = 'Managed Identity' nem armazena segredo, então não precisa de uma chave mestra de banco de dados.
    • Uma credencial do Microsoft Entra ID usa IDENTITY = 'User Identity' ou IDENTITY = 'Managed Identity' e não armazena nenhum segredo, portanto não requer uma chave mestra do banco de dados.

Dica

Se sua CREATE DATABASE SCOPED CREDENTIAL declaração não inclui um segredo, você não precisa 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 = '<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 arquivos no SQL Server 2022 (16.x) e no SQL Server 2019 (15.x) 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 a nuvem 1; Não para o local SQL Server 2022 (16.x) e SQL Server 2019 (15.x)
Consultas de arquivo no SQL Server 2025 (17.x) e versões posteriores 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 No 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
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)

1 Para acesso a arquivos em nuvem no SQL Server 2022 (16.x), o recurso PolyBase deve ser instalado.

  • As consultas OLE DB usam OPENROWSET(provider, connection, query) para se conectarem a qualquer fonte OLE DB por meio do MSOLEDBSQL, SQLOLEDB ou outro provedor em todas as versões com suporte do SQL Server. Eles suportam autenticação SQL, autenticação do Windows e Microsoft Entra ID com MSOLEDBSQL, e não exigem a instalação dos serviços PolyBase.
  • Consultas de arquivo são usadas OPENROWSET(BULK ...) para ler arquivos em disco local, compartilhamentos de rede ou armazenamento em nuvem, como Armazenamento de Blobs do Azure, ADLS, S3 ou OneLake, usando um token SAS, chave de acesso, Identidade Gerenciada ou Microsoft Entra ID. Eles são suportados para arquivos locais e de rede no SQL Server 2005 e versões posteriores, para arquivos em nuvem no SQL Server 2022 (16.x) e versões posteriores, e no Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Fabric. Consultas de arquivos não exigem serviços PolyBase para arquivos locais ou para arquivos em nuvem no SQL Server 2022 (16.x) e versões posteriores.
  • Os conectores PolyBase usam CREATE EXTERNAL TABLE com CREATE EXTERNAL DATA SOURCE e o local sqlserver://, oracle://, teradata://, mongodb:// ou odbc:// para se conectar a fontes remotas de SQL Server, Oracle, Teradata, MongoDB ou ODBC. Eles exigem autenticação SQL e serviços PolyBase no SQL Server 2019 (15.x) e versões posteriores no Windows e SQL Server 2025 (17.x) e versões posteriores no Linux. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE (Transact-SQL).

Quando usar cada abordagem

Use OLE DB OPENROWSET para:

  • Use o OLE DB OPENROWSET para consultas rápidas e pontuais, sem criar objetos persistentes.
  • Use o OLE DB OPENROWSET para autenticação do Microsoft Entra ID ou da Identidade Gerenciada por meio do MSOLEDBSQL.
  • Use o OLE DB OPENROWSET para evitar dependências de serviços PolyBase.
  • Use o OLE DB OPENROWSET para se conectar a qualquer fonte de dados que tenha um provedor OLE DB.

Use Arquivo OPENROWSET(BULK) para:

  • Use o arquivo OPENROWSET(BULK ...) para exploração de arquivos ad hoc e descoberta de esquemas.
  • Use o arquivo OPENROWSET(BULK ...) para transformações rápidas e prévias antes de se comprometer com uma definição de tabela.
  • Use o arquivo OPENROWSET(BULK ...) para transformações flexíveis de colunas inline, como casting, filtragem e colunas computadas.
  • Use o arquivo OPENROWSET(BULK ...) para dados que não mudam com frequência e não precisam de metadados persistentes.

Use Conectores do PolyBase com CREATE EXTERNAL TABLE para:

  • Use conectores PolyBase com CREATE EXTERNAL TABLE para criar definições de tabelas persistentes e reutilizáveis que podem ser acessadas por vários usuários ou aplicativos.
  • Use conectores PolyBase com CREATE EXTERNAL TABLE para cargas de trabalho de produção que exigem estatísticas e otimização do plano de consulta.
  • Use conectores PolyBase com CREATE EXTERNAL TABLE para processamento por pushdown em fontes remotas, como Oracle e SQL Server.
  • Use os conectores PolyBase com CREATE EXTERNAL TABLE para governança compartilhada e segurança; após a criação da tabela, os usuários precisam apenas da permissão SELECT.
  • Use conectores PolyBase com CREATE EXTERNAL TABLE quando a autenticação SQL estiver disponível para a fonte remota.

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

O formulário OLE DB de OPENROWSET conecta-se a uma fonte de dados remota por meio de um provedor OLE DB, executa uma consulta de passagem 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 em versões anteriores, ele lê a partir de caminhos de arquivo locais 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 a partir do arquivo (Parquet) ou especificado em linha com uma cláusula WITH Definido explicitamente na declaração CREATE EXTERNAL TABLE
Permissões Requer ADMINISTER BULK OPERATIONS ou ADMINISTER 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 Instância Gerenciada de SQL do Azure: estatísticas manuais de coluna única via sys.sp_create_openrowset_statistics. Confira as estatísticas manuais do OPENROWSET.

SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure, Banco de Dados SQL no Fabric: criação automática de estatísticas em predicados. Estatísticas manuais OPENROWSET não são suportadas no SQL Server.
Suporte completo a CREATE STATISTICS em todas as plataformas, além da criação automática no SQL Server 2022 (16.x) e versões posteriores. Consulte Criar estatísticas manuais para tabela externa.
Pushdown Suporte limitado. O mecanismo pode propagar filtros para a varredura de arquivos, mas não há propagação de filtros para fontes RDBMS remotas. 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
  • OPENROWSET(BULK ...) é melhor para exploração ad hoc e consultas pontuais, enquanto uma tabela externa é melhor para definições persistentes e reutilizáveis de tabelas.
  • OPENROWSET(BULK ...) não armazena metadados no banco de dados após a execução da consulta, enquanto uma tabela externa armazena a definição da tabela, a fonte de dados e o formato do arquivo como objetos do banco de dados.
  • OPENROWSET(BULK ...) deduz automaticamente o esquema de um arquivo Parquet ou o define diretamente com a cláusula WITH, enquanto uma tabela externa define o esquema explicitamente na instrução CREATE EXTERNAL TABLE.
  • OPENROWSET(BULK ...) requer ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, enquanto uma tabela externa pode ser consultada por usuários que só precisam de permissão padrão SELECT uma vez que a tabela existe.
  • OPENROWSET(BULK ...) suporta colunas computadas nas funções de consulta e metadados como filename() e filepath(), enquanto uma tabela externa possui uma lista de colunas fixa e requer transformações em uma visualização ou na consulta que lê a tabela externa.
  • OPENROWSET(BULK ...)possui suporte limitado a estatísticas: o Instância Gerenciada de SQL do Azure pode ser usado sys.sp_create_openrowset_statistics para estatísticas de coluna única, mas o SQL Server 2022 (16.x) e versões posteriores, o Banco de Dados SQL do Azure e o SQL Database no Fabric criam automaticamente estatísticas sobre predicados. Estatísticas manuais OPENROWSET não são compatíveis com SQL Server, Banco de Dados SQL do Azure e banco de dados SQL no Fabric. Uma tabela externa oferece suporte completo a CREATE STATISTICS em todas as plataformas, bem como a estatísticas automáticas no SQL Server 2022 (16.x) e versões posteriores, no Banco de Dados SQL do Azure e no banco de dados SQL no Fabric. Veja estatísticas manuais do OPENROWSET e Criar estatísticas manuais para tabela externa.
  • OPENROWSET(BULK ...) tem capacidade limitada de pushdown e não oferece pushdown para fontes remotas de RDBMS, enquanto uma tabela externa oferece suporte à computação com pushdown para conectores RDBMS.
  • OPENROWSET(BULK ...) é ideal para exploração de dados, descoberta de esquemas, prototipagem, cargas únicas e transformações flexíveis, enquanto uma tabela externa é ideal para cargas de trabalho de produção, consultas repetidas, acesso compartilhado, 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 embutidos ou filtrar com base em expressões calculadas 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 só precisam de permissão SELECT 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 deles devo usar?

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

A instrução independente BULK INSERT não é suportada no banco de dados SQL no Fabric. Para ingerir dados, use INSERT ... SELECT com 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 do arquivo para a tabela no formato original (o mapeamento é controlado pelo arquivo de formato ou pela ordem das colunas). 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 DATA_SOURCEsuporta Armazenamento de Blobs do Azure no SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure. O SQL Server 2019 CU11 e atualizações posteriores também suportam ADLS Gen2. Armazenamento compatível com S3 não é suportado. DATA_SOURCEsuporta Armazenamento de Blobs do Azure no SQL Server 2017 (14.x) e versões posteriores, ADLS Gen2 no SQL Server 2019 CU11 e versões posteriores, e armazenamento compatível com S3 no SQL Server 2022 (16.x) e versões posteriores. Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure suportam Armazenamento de Blobs do Azure e ADLS Gen2. O banco de dados SQL no Fabric suporta OneLake e armazenamento externo por meio de atalhos OneLake.
Arquivos Parquet ou Delta Sem suporte. Somente texto CSV/delimitado Sim. SQL Server 2022 (16.x) e versões posteriores, Instância Gerenciada de SQL do Azure e Banco de Dados SQL do Azure suportam FORMAT = 'PARQUET' e FORMAT = 'DELTA'; o Banco de Dados SQL no Fabric suporta FORMAT = 'PARQUET', mas não DELTA. Para obter mais informações, consulte OPENROWSET BULK (Transact-SQL).
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
Log mínimo Sim. Compatível com os modelos de recuperação simples ou de registro em massa usando TABLOCK Sim. Com suporte quando usado com INSERT ... SELECT e TABLOCK
  • BULK INSERT carrega dados de um arquivo diretamente na tabela de destino, enquanto OPENROWSET(BULK ...) retorna um conjunto de linhas que você pode usar em uma instrução INSERT ... SELECT ou SELECT.
  • BULK INSERT é uma instrução independente, enquanto OPENROWSET(BULK ...) deve ser usada dentro de uma consulta como SELECT * FROM OPENROWSET(BULK ...) ou INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...).
  • BULK INSERT sempre grava diretamente em uma tabela de destino, enquanto OPENROWSET(BULK ...) pode SELECT de um arquivo sem inserir os dados em lugar nenhum ou inseri-los em qualquer tabela ou tabela temporária.
  • BULK INSERT tem suporte limitado para transformações nas colunas porque os dados fluem do arquivo para a tabela como estão, com o mapeamento controlado por um arquivo de formato ou pela ordem das colunas. OPENROWSET(BULK ...) oferece suporte a expressões, CAST, filtros WHERE, JOINs e colunas calculadas no SELECT circundante.
  • BULK INSERT usa a cláusula WITH para BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK e outras indicações. OPENROWSET(BULK ...) suporta dicas de tabela por meio de INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...).
  • BULK INSERT não suporta importação de valor único de objetos grandes. OPENROWSET(BULK ...) suporta SINGLE_BLOB, SINGLE_CLOB, e SINGLE_NCLOB para importar um arquivo inteiro como um valor varbinary(max), varchar(max) ou nvarchar(max ), respectivamente.
  • Ambos, BULK INSERT e OPENROWSET(BULK ...), suportam arquivos em formatos XML e não XML.
  • Para acesso a arquivos na nuvem com BULK INSERT, o DATA_SOURCE parâmetro suporta Armazenamento de Blobs do Azure no SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure. O SQL Server 2019 CU11 e atualizações posteriores também suportam ADLS Gen2, mas BULK INSERT não suportam armazenamento compatível com S3. Para OPENROWSET(BULK ...), DATA_SOURCE suporta Armazenamento de Blobs do Azure no SQL Server 2017 (14.x) e versões posteriores, ADLS Gen2 no SQL Server 2019 CU11 e versões posteriores, e armazenamento compatível com S3 no SQL Server 2022 (16.x) e versões posteriores. Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure suportam Armazenamento de Blobs do Azure e ADLS Gen2. O banco de dados SQL no Fabric suporta OneLake e armazenamento externo por meio de atalhos OneLake.
  • BULK INSERT não suporta arquivos Parquet ou Delta e suporta apenas CSV ou texto delimitado. OPENROWSET(BULK ...)suporta FORMAT = 'PARQUET' eFORMAT = 'DELTA', no SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure. O banco de dados SQL no Fabric suportaFORMAT = 'PARQUET', mas não FORMAT = 'DELTA'. Para obter mais informações, consulte OPENROWSET BULK (Transact-SQL).
  • BULK INSERT requer ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, além da permissão INSERT na tabela de destino, enquanto OPENROWSET(BULK ...) requer ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS.
  • BULK INSERT é compatível com log mínimo no modelo de recuperação simples ou com log em massa com TABLOCK. OPENROWSET(BULK ...) suporta logs mínimos 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:

  • Use OPENROWSET(BULK ...) para consultar ou pré-visualizar dados de arquivos sem criar uma tabela antes.
  • Use OPENROWSET(BULK ...) para transformar, filtrar ou unir dados durante a importação.
  • Uso OPENROWSET(BULK ...) para carregar arquivos Parquet ou Delta porque BULK INSERT não suporta esses formatos.
  • Use OPENROWSET(BULK ...) para importar um arquivo inteiro como um único valor LOB com SINGLE_BLOB, SINGLE_CLOB, ou 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çar com OPENROWSET(BULK ...) em um SELECT para explorar e validar os dados do arquivo e depois mude para BULK INSERT para a carga final em produção, se você não precisar de transformações. Se você precisa de suporte para Parquet ou Delta, ou filtragem em linha, continue com OPENROWSET.

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

Funções de metadados úteis

Quando você consulta arquivos externos usando OPENROWSET ou tabelas externas, utilize as funções e procedimentos integrados para inspecionar metadados de arquivos, descobrir esquemas e implementar consultas conscientes de partições.

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 enésimo (th) segmento de pasta do curinga (*) no caminho BULK, onde 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 filtros filepath() na cláusula WHERE clause em vez de em uma subconsulta ou CTE. Quando o filtro está na cláusula WHERE, o mecanismo pode realizar a eliminação de partições no nível de varredura de arquivos, o que reduz significativamente a E/S.

sp_describe_first_result_set - descobrir tipos de coluna do OPENROWSET

Quando você usa OPENROWSET com arquivos Parquet, o mecanismo infere automaticamente os tipos de dados das colunas (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), onde 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 para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Fabric, mas é especialmente útil para consultas OPENROWSET. 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
Cálculo de aplicação Cálculos de empilhamento no PolyBase Especifica quais operações de push são enviadas para a fonte remota
Como saber se ocorreu o pushdown Como saber se ocorreu o pushdown 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