Partilhar via


Conectar, consultar e exportar dados com o PolyBase

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Azure SQL Database Azure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

A virtualização de dados permite-lhe executar consultas Transact-SQL (T-SQL) sobre dados externos sem os carregar na sua base de dados. PolyBase é a funcionalidade do Motor de Base de Dados que implementa virtualização de dados entre SQL Server e Azure SQL. Defines uma fonte de dados externa, um formato de ficheiro opcional e uma tabela externa, e depois consultas a tabela externa como SELECT qualquer outra tabela.

Este guia ajuda-o a:

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

Casos comuns de utilização

A tabela seguinte descreve possíveis cenários de utilização.

Scenario Utilização
Exploração ad-hoc de ficheiros OPENROWSET(BULK ...)
Consulta a ficheiros reutilizáveis para BI/relatórios Tabelas externas sobre ficheiros
Consulta entre bases de dados (SQL Server, Oracle, Teradata, MongoDB, ODBC) Conectores PolyBase com tabelas externas
Exportação dos resultados das consultas para ficheiros CREATE EXTERNAL TABLE AS SELECT (CETAS)
Ingestão em massa nas mesas BULK INSERT ou OPENROWSET(BULK ...) com INSERT ... SELECT

Que funcionalidades estão disponíveis onde?

A tabela seguinte mostra quais as funcionalidades principais do PolyBase e virtualização de dados disponíveis em cada plataforma SQL. Use esta tabela para determinar o que pode fazer na sua plataforma antes de usar os guias detalhados.

Feature SQL Server 2019 SQL Server 2022 SQL Server 2025 Base de Dados SQL do Azure Azure SQL Managed Instance 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
CSV / ficheiros delimitados Sim2 Sim Sim Sim Sim Sim
Ficheiros Parquet No Sim Sim Sim Sim Sim
Tabelas do Delta Lake No Sim Sim No No No
Liga-te a outro SQL Server Sim Sim Sim No No No
Liga-te ao Azure SQL Database ou Azure SQL Managed Instance Sim 3 Sim 3 Sim 3 No No No
Liga-te à Oracle / Teradata / MongoDB Sim Sim Sim No No No
Conectar-se ao Azure Blob Storage Sim Sim Sim Sim Sim No
Liga-te à ADLS Gen2 No Sim Sim Sim Sim No
Liga-te a armazenamento compatível com S3 No Sim Sim No No No
Ligar-se ao OneLake (Fabric) No No No No No Sim
Cálculo por empurramento Sim Sim Sim No No No
Autenticação de Identidade Gerida No No Sim 4 Sim Sim No

1 O SQL Server 2019 (15.x) suporta OPENROWSET(BULK...) caminhos de ficheiros locais e de rede. No SQL Server 2022 (16.x) e versões posteriores, OPENROWSET(BULK...) também suporta a leitura a partir de armazenamento na nuvem com FORMAT = 'PARQUET', FORMAT = DELTA, e FORMAT = 'CSV'.

Suporte a CSV 2 no SQL Server 2019 (15.x) requeria Hadoop. No SQL Server 2022 (16.x) e versões posteriores, o CSV é suportado nativamente sem Hadoop.

3 Utiliza o conector SQL Server (sqlserver://). A credencial com escopo da base de dados tem como alvo o endpoint Azure SQL, os mesmos passos que ligar a outro SQL Server.

4 A autenticação por Identidade Gerida é suportada para ligação ao Azure Blob Storage (ABS) e ADLS Gen2. Requer SQL Server habilitado com Azure Arc ou SQL Server numa VM Azure para SQL Server local. Está disponível nativamente no Azure SQL Database e no Azure SQL Managed Instance.

Observação

A partir do SQL Server 2025 (17.x), consultar ficheiros de dados (CSV, Parquet e Delta) no Azure Blob Storage, ADLS Gen2 ou armazenamento compatível com S3 é uma funcionalidade nativa do motor e já não requer instalar ou executar serviços PolyBase. Os conectores RDBMS (SQL Server, Oracle, Teradata, MongoDB, ODBC) ainda requerem que os serviços PolyBase estejam instalados e a funcionar. O SQL Server 2025 (17.x) também adiciona suporte Linux para estes conectores, que anteriormente estavam disponíveis apenas no Windows.

Interrogar dados externos

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

Abordagem Sintaxe Utilizar quando Authentication PolyBase necessário
Consultas ad hoc OLE DB OPENROWSET(provider, connection, query) Quer uma consulta rápida e única sem objetos persistentes, ou precisa de autenticação com ID Microsoft Entra Autenticação SQL, Autenticação Windows, Microsoft Entra ID (MSOLEDBSQL) No
Arquivar consultas ad hoc OPENROWSET(BULK ...) Quer explorar rapidamente os dados dos ficheiros ou testar esquemas antes de criar uma tabela Token SAS, chave de acesso, Identidade Gerida, Microsoft Entra ID Sim, para Azure SQL Database e Azure SQL Managed Instance

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

Os serviços PolyBase são necessários para o acesso a ficheiros na cloud no SQL Server 2019 (15.x) e 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 Recommendation
Preciso de autenticação Microsoft Entra ID para SQL remoto, ou pretendo evitar utilizar os serviços PolyBase. Uso OPENROWSET(MSOLEDBSQL, ...) (ad hoc, sem objetos persistentes)
Preciso de tabelas persistentes, estatísticas ou cálculo pushdown para bases de dados remotas Use CREATE EXTERNAL TABLE com conectores PolyBase (sqlserver://, oracle://, teradata://, mongodb://, odbc://). OPENROWSET não suporta conectores
Estou a explorar um novo ficheiro ou a testar um esquema Uso OPENROWSET(BULK ...) (iteração rápida, sem objetos persistentes)
Estou a ingerir dados de ficheiros numa tabela com transformações Use INSERT ... SELECT de OPENROWSET(BULK ...)
Preciso de governação ou acesso partilhado para muitos utilizadores ou aplicações Use CREATE EXTERNAL TABLE para que as permissões e metadados sejam centralizados
Estou a trabalhar em base de dados SQL no Fabric Use OPENROWSET(BULK ...) para consultas ad hoc do OneLake ou tabelas externas para acesso reutilizável; para armazenamento externo, utilize atalhos do OneLake

Escolha o seu cenário

Agora que compreende as três abordagens, utilize um dos seguintes guias para implementar o seu caso de uso específico.

Ficheiros de consulta (Parquet, CSV ou Delta)

Se os seus dados estiverem em ficheiros Parquet, CSV ou Delta no Azure Blob Storage, ADLS Gen2, armazenamento compatível com S3 ou OneLake, siga um destes guias:

Scenario Guia recomendado Plataformas
Consulta rápida e ad hoc num ficheiro Parquet ou CSV Utilize OPENROWSET. Não é necessária mesa externa SQL Server 2022 (16.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL database in Fabric
Consultas repetidas em ficheiros Parquet com um esquema persistente Crie uma mesa externa sobre Parquet SQL Server 2022 (16.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL database in Fabric
Consultar ficheiros CSV com uma tabela externa Crie uma tabela externa com um formato de ficheiro para texto delimitado SQL Server 2019 (15.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL database in Fabric
Consultar tabelas Delta Lake Crie uma tabela externa com FILE_FORMAT = DeltaLakeFileFormat SQL Server 2022 (16.x) e versões posteriores
Exportar resultados de consulta para ficheiros Parquet ou CSV (CETAS) Utilize CREATE EXTERNAL TABLE AS SELECT SQL Server 2022 (16.x) e versões posteriores, Azure SQL Managed Instance

Pode também seguir um destes tutoriais passo a passo:

Tutorial Descrição
Introdução ao PolyBase no SQL Server 2022 Abrange OPENROWSET com Parquet e CSV, tabelas externas e navegação de pastas.
Virtualizar o ficheiro parquet num armazenamento de objetos compatível com S3 com o PolyBase Tutorial para SQL Server 2022 (16.x) e versões posteriores.
Virtualizar ficheiro CSV com PolyBase Tutorial para SQL Server 2022 (16.x) e versões posteriores.
Virtualize tabela delta com PolyBase Tutorial para SQL Server 2022 (16.x) e versões posteriores.
Virtualização de dados com a Base de Dados SQL do Azure (Pré-visualização) Azure SQL Database guide para Parquet e CSV.
Virtualização de dados com a Instância Gerenciada SQL do Azure Guia Azure SQL Managed Instance para Parquet, CSV e CETAS.
Virtualização de dados em base de dados SQL no Fabric Guia da base de dados SQL em Fabric para ficheiros OneLake.

Liga-te a outra instância SQL Server, Azure SQL Database ou SQL Managed Instance

No SQL Server 2019 (15.x) e versões posteriores, o PolyBase pode consultar tabelas noutra instância do SQL Server, Azure SQL Database ou Azure SQL Managed Instance, sem recorrer a servidores ligados.

Importante

O sqlserver:// conector não é suportado na base de dados SQL no Fabric. Os conectores RDBMS PolyBase usam autenticação SQL através CREATE DATABASE SCOPED CREDENTIAL e não suportam Microsoft Entra ID, Managed Identity ou autenticação de principal de serviço. Como a base de dados SQL no Fabric requer autenticação Microsoft Entra, não podes ligar-te a ela usando PolyBase.

Step O que fazer
1. Instalar o PolyBase Instale o PolyBase no Windows ou instale o PolyBase no Linux
2. Criar uma credencial CREATE DATABASE SCOPED CREDENTIAL com o login alvo
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>

Sugestão

O conector SQL Server (sqlserver://) também funciona para Azure SQL Database e Azure SQL Managed Instance. Use os mesmos passos e defina LOCATION para o endpoint Azure SQL (por exemplo, sqlserver://myserver.database.windows.net).

Para um guia detalhado, consulte Configurar PolyBase para aceder a dados externos no SQL Server.

Liga-te ao Oracle, Teradata ou MongoDB

SQL Server 2019 (15.x) e versões posteriores podem consultar Oracle, Teradata, MongoDB e Cosmos DB através de conectores PolyBase ODBC.

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

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

Conectar-se ao Azure Blob Storage ou 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 Gerida (a partir do SQL Server 2025 (17.x)) Configure o PolyBase para aceder a dados externos no Azure Blob Storage
SQL Server 2019 (15.x) Chave de acesso (via conector Hadoop) Configure o PolyBase para aceder a dados externos no Azure Blob Storage
Base de Dados SQL do Azure SAS Token, Identidade Gerida, Microsoft Entra pass-through Virtualização de dados com a Base de Dados SQL do Azure (Pré-visualização)
Azure SQL Managed Instance Token SAS, Identidade Gerida Virtualização de dados com a Instância Gerenciada SQL do Azure

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

  • Azure Blob Storage: Alterar wasb[s]:// para abs://
  • ADLS Gen2: Mudança abfs[s]:// para adls://

Para mais informações, consulte Configurar PolyBase para aceder a dados externos no Azure Blob Storage.

Liga-se a armazenamento de objetos compatível com S3

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

Para obter mais informações, consulte 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 ficheiros externos (Parquet ou CSV) no Azure Blob Storage, ADLS Gen2 ou armazenamento compatível com S3.

Plataforma SQL Suportado Formatos de exportação Notes
SQL Server 2022 (16.x) e versões posteriores Sim Parquet, CSV Requer configuração do servidor: permitir exportação de polybase
Azure SQL Managed Instance Sim Parquet, CSV Desativado por defeito
Base de Dados SQL do Azure No Nenhum Não disponível
Banco de dados SQL no Fabric No Nenhum Não disponível

Para a referência Transact-SQL, veja CRIAR TABELA EXTERNA COMO SELECT (CETAS).

Exemplos de arranque rápido

Exemplo 1: Consulta ad hoc num ficheiro Parquet (OPENROWSET)

Não é necessária mesa externa. Funciona no SQL Server 2022 (16.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance e base de dados SQL em 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 sobre CSV no Azure Blob Storage

Este exemplo funciona em todas as plataformas SQL que suportam PolyBase.

  • Passo 1: Crie uma chave mestra de base de dados (DMK). Este passo é necessário porque a credencial armazena um segredo de token SAS. No entanto, pode fazer este passo se usar Identidade Gerida ou autenticação Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>';
    
  • Passo 2: Crie 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 '?'
    
  • Passo 3: Crie uma fonte de dados externa.

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

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

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

Exemplo 3: Consultar uma tabela noutro SQL Server

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

  • Passo 1: Crie uma chave mestra da base de dados (necessária porque a credencial armazena uma palavra-passe).

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

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

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • Passo 4: Crie a tabela externa (nome em três partes em 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'
    );
    
  • Passo 5: Consulta 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 versões posteriores, Azure SQL Managed Instance.

  • Passo 1: Ativar o CETAS (apenas SQL Server).

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • Passo 2: Criar credenciais e fonte de dados (reutilizar exemplos anteriores).

  • Passo 3: Criar um formato de ficheiro para exportação do Parquet.

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • Passo 4: Exportar os 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, compreenda os objetos T-SQL centrais que a PolyBase utiliza e como eles se encaixam:

Diagrama que mostra os objetos Transact-SQL PolyBase e as suas relações.

Diagrama que mostra os objetos PolyBase T-SQL e as suas relações, desde a autenticação (chave mestra da base de dados, credenciais) através de fontes de dados e formatos de ficheiro até aos métodos de consulta (External Table, OPENROWSET, BULK INSERT, CETAS).

Para informações sobre estas instruções T-SQL, veja:

Para uma referência Transact-SQL completa para todos os objetos, veja PolyBase Transact-SQL referência.

Importante

Verifique o mapeamento dos tipos de dados para o formato de ficheiro externo. Quando cria um formato de ficheiro externo, ou ficheiros de consulta usando OPENROWSET, o PolyBase mapeia automaticamente tipos de dados fonte (Parquet, CSV, Delta, Oracle, Teradata, MongoDB) para tipos de dados SQL Server. Tipos desajustados podem causar truncamento silencioso, perda de precisão ou erros de consulta. Por exemplo, um Parquet DECIMAL(38,18) mapeia para DECIMAL(18,0). Revise as tabelas de mapeamento antes de definir colunas externas ou uma WITH cláusula. Para referência completa, veja Mapeamento de Tipos com PolyBase.

Quando é necessário criar chave mestra?

Uma chave mestra de base de dados (DMK) é criada usando CREATE MASTER KEY sintaxe. O DMK encripta os segredos armazenados nas credenciais com âmbito de base de dados. É exigido apenas quando a credencial contém um valor secreto, ou seja, quando armazena uma palavra-passe, token ou chave de acesso.

  • O DMK é obrigatório (a credencial guarda um segredo):

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

    Tipo de autenticação IDENTITY valor Tem segredo DMK
    Identidade gerenciada 'Managed Identity' No Não obrigatório
    Microsoft Entra ID 'User Identity' ou 'Managed Identity' No Não obrigatório

Sugestão

Se não houver segredo na tua CREATE DATABASE SCOPED CREDENTIAL declaração, não precisas de DMK. Identidade gerida e autenticação Microsoft Entra ID delegam confiança à plataforma. A base de dados não armazena palavras-passe nem tokens.

Exemplos:

Nesta consulta de exemplo, é necessário o DMK (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>';

Neste exemplo de consulta, o DMK não é obrigatório (Identidade Gerida, sem segredo).

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

Neste exemplo de consulta, o DMK não é necessário (Microsoft Entra pass-through, sem necessidade de segredo).

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

Acesso remoto a dados com OPENROWSET e tabelas externas

O SQL Server oferece três abordagens distintas para consultar dados remotos. Pode escolher a abordagem certa quando compreender as diferenças na sintaxe, autenticação e arquitetura.

Abordagem Sintaxe Conecta-se a Authentication Serviços PolyBase Plataformas
Consultas OLE DB OPENROWSET(provider, connection, query) Qualquer fonte OLE DB via MSOLEDBSQL, SQLOLEDB ou outros fornecedores Autenticação SQL, Autenticação Windows, Microsoft Entra ID (MSOLEDBSQL) No SQL Server (todas as versões suportadas)
Consultas a ficheiros OPENROWSET(BULK ...) Ficheiros em disco local, rede ou cloud (Azure Blob, ADLS, S3, OneLake) Token SAS, chave de acesso, Identidade Gerida, Microsoft Entra ID Sim, para a cloud*; Não para local SQL Server 2005; SQL Server 2022 (16.x) e versões posteriores (cloud); Azure SQL
Conectores PolyBase CREATE EXTERNAL TABLE com CREATE EXTERNAL DATA SOURCE usando sqlserver://, oracle://, teradata://, mongodb://, odbc:// Fontes do Remote SQL Server, Oracle, Teradata, MongoDB, 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 PolyBase são necessários para o acesso a ficheiros na cloud no SQL Server 2019 (15.x) e SQL Server 2022 (16.x). O SQL Server 2025 (17.x) e versões posteriores têm suporte nativo para ficheiros cloud e já não requerem PolyBase para CSV, Parquet ou Delta.

Quando usar cada abordagem

Use OLE DB OPENROWSET para:

  • Consultas rápidas e pontuais, sem criar objetos persistentes
  • Autenticação por Identidade Gerida ou Microsoft Entra ID (via MSOLEDBSQL)
  • Evitar dependências do serviço PolyBase
  • Ligação a qualquer fonte de dados com um fornecedor OLE DB

Use o ficheiro OPENROWSET(BULK) para:

  • Exploração ad hoc de ficheiros e descoberta de esquemas
  • Transformações rápidas e pré-visualizações antes de se comprometer com uma definição de tabela
  • Transformações flexíveis de colunas em linha (casting, filtragem, colunas computadas)
  • Dados que não mudam frequentemente e que não precisam de metadados persistentes

Use conectores PolyBase com a instrução CREATE EXTERNAL TABLE para:

  • Definições de tabelas persistentes e reutilizáveis acedidas por múltiplos utilizadores ou aplicações
  • Cargas de trabalho de produção que requerem estatísticas e otimização de planos de consulta
  • Processamento por push para fontes remotas (filtros enviados para Oracle, SQL Server, etc.)
  • Governação partilhada e segurança (uma vez criadas, os utilizadores só precisam SELECT de permissão)
  • Quando tem autenticação SQL disponível para a fonte remota

OPENROWSET (OLE DB) - consultas remotas ad hoc (sem necessidade de serviços PolyBase)

A forma OLE DB de OPENROWSET liga-se a uma fonte de dados remota através de um fornecedor OLE DB, executa uma consulta pass-through e devolve os resultados como um conjunto de linhas. É uma alternativa pontual e ad hoc a um servidor ligado. Não são criados metadados persistentes. Esta sintaxe não requer serviços PolyBase, nem suporta ficheiros na cloud nem fontes de dados externas.

Esta consulta de exemplo liga-se a um SQL Server remoto via OLE DB (não 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 ficheiros (PolyBase)

A BULK forma de OPENROWSET lê dados diretamente de ficheiros. No SQL Server 2019 (15.x) e versões anteriores, lê a partir de caminhos de ficheiros locais ou UNC e requer um ficheiro de formatação. No SQL Server 2022 (16.x) e versões posteriores, pode ler do armazenamento na cloud usando os parâmetros DATA_SOURCE e FORMAT. Esta abordagem é a versão integrada no PolyBase, utilizada para virtualização de dados.

No contexto do PolyBase e da virtualização de dados, quando este guia menciona OPENROWSET, está a referir-se à sintaxe OPENROWSET(BULK ...) com uma cláusula FORMAT para consultas a ficheiros externos.

Exemplos:

Esta consulta de exemplo lê um ficheiro Parquet do Azure Blob Storage (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 ficheiro Parquet com um caminho inline (Azure SQL Database, Azure SQL Managed Instance).

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

Quando usar OPENROWSET vs. tabelas externas

Tanto OPENROWSET(BULK ...) como as tabelas externas permitem consultar dados externos com T-SQL, mas foram criadas para diferentes casos de uso. A tabela seguinte resume as principais diferenças para o ajudar a decidir qual a abordagem que se adequa ao seu cenário.

Capacidade OPENROWSET(BULK ...) Tabela externa
Objetivo Exploração ad hoc e consultas pontuais Definição de tabela persistente e reutilizável
Metadados armazenados na base de dados Não. Nada é guardado após a execução da consulta Yes. A definição da tabela, a fonte de dados e o formato do ficheiro são armazenados como objetos da base de dados
Definição de esquema Inferido automaticamente a partir do ficheiro (Parquet) ou especificado diretamente com uma cláusula Definido explicitamente na CREATE EXTERNAL TABLE afirmação
Permissões Requer ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS Uma vez criada, a permissão padrão SELECT na tabela é suficiente
Colunas calculadas Yes. Adicionar expressões e colunas calculadas na SELECT lista; funções de metadados como filename() e filepath() só estão disponíveis aqui. Não. Lista de colunas fixas; realizam transformações numa vista ou na consulta que lê a tabela externa
Estatísticas Azure SQL: estatísticas manuais de coluna única via sys.sp_create_openrowset_statistics; SQL Server 2022 (16.x) e versões posteriores: criação automática de estatísticas em predicados (sem estatísticas manuais no SQL Server). Consulte as estatísticas do manual do OPENROWSET. Suporte total CREATE STATISTICS em todas as plataformas, além de criação automática no SQL Server 2022 (16.x) e versões posteriores. Consulte Estatísticas manuais de tabela externa.
Empurrão Apoio limitado. O motor pode empurrar filtros para a análise de ficheiros, mas não há pressão para fontes remotas de RDBMS Yes. Suporta cálculo pushdown para conectores RDBMS (SQL Server, Oracle, Teradata, MongoDB)
Melhor para Exploração de dados, descoberta de esquemas, consultas de prototipagem, cargas de dados únicas, transformações flexíveis Cargas de trabalho em produção, consultas repetidas, acesso partilhado entre utilizadores, dashboards e relatórios

Usa o OPENROWSET quando precisares de flexibilidade

OPENROWSET Use para explorar um ficheiro, testar diferentes esquemas ou adicionar colunas computadas e transformações sem criar quaisquer objetos persistentes. Por exemplo, pode extrair o caminho do ficheiro como uma coluna, converter tipos de dados de forma integrada ou filtrar expressões calculadas numa ú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';

Sugestão

As funções filepath() e filename() estão disponíveis no Azure SQL Database, Azure SQL Managed Instance e no SQL Server 2022 (16.x) e versões posteriores. Permitem-te filtrar partes do caminho do ficheiro (eliminação de partições) e expor o nome do ficheiro de origem como uma coluna, o que não é diretamente possível com tabelas externas.

Use tabelas externas quando precisar de persistência e governação

Use tabelas externas quando vários utilizadores ou aplicações precisam de consultar repetidamente os mesmos dados externos. Define o esquema, a fonte de dados e as credenciais uma vez e armazena-os na base de dados. Os consumidores só precisam SELECT de permissão na mesa.

Tabelas externas também suportam estatísticas, que o otimizador de consultas utiliza para construir melhores planos de execução. Pode criar estatísticas manualmente ou deixar o motor criá-las automaticamente (SQL Server 2022 (16.x) e versões posteriores).

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

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

Para mais informações sobre estatísticas para ambas as abordagens, consulte Considerações de desempenho do PolyBase - Estatística.

BULK INSERT vs. OPENROWSET (BULK): Qual devo usar?

Tanto BULK INSERT quanto OPENROWSET(BULK ...) importam dados de ficheiros para o SQL Server usando o mesmo motor de carregamento em massa subjacente. No entanto, diferem na sintaxe, flexibilidade e no que pode fazer com os resultados. A tabela a seguir resume as principais diferenças:

Observação

BULK INSERT não está disponível na base de dados SQL no Fabric. Para o Fabric, usa OPENROWSET(BULK ...) com o OneLake.

Capacidade BULK INSERT OPENROWSET(BULK ...)
Propósito básico Carrega dados de um ficheiro diretamente para uma tabela de destino Devolve um conjunto de linhas que usas numa SELECT instrução ou INSERT ... SELECT
Padrão de utilização Declaração independente: 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 alvo? Yes. Escreve sempre diretamente numa tabela Não. Podes SELECT fazer isso sem inserir em lado nenhum, ou inserir em qualquer tabela ou tabela temporária
Transformações de coluna durante a carga Apoio limitado. Os dados fluem do ficheiro para a tabela tal como estão (mapeamento controlado pelo ficheiro de formato ou pela ordem das colunas) Apoio total. Pode adicionar expressões, CAST, WHERE filtros, JOIN outras tabelas e colunas computadas ao redor SELECT
Dicas para a tabela A WITH cláusula inclui suporte para BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK, e mais Suporta dicas de tabela através da INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...) sintaxe
Importação de valor único para objetos grandes (LOB) Não suportado Yes. Suporta SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB para importar um ficheiro inteiro como um valor varbinary(max), varchar(max) ou nvarchar(max)
Ficheiros de formato Yes. Suportado via (XML e não-XML) Yes. Suportado (XML e não XML)
Acesso a ficheiros na cloud (Azure Blob Storage, ADLS Gen2, S3) Yes. Suportado via DATA_SOURCE parameter (SQL Server 2017 (14.x) e versões posteriores, Azure SQL) Yes. Suportado via DATA_SOURCE parâmetro ou URL inline com FORMAT cláusula (SQL Server 2022 (16.x) e versões posteriores, Azure SQL)
Arquivos de Parquet ou Delta Não suportado. Apenas CSV/texto delimitado Yes. Suportado com FORMAT = 'PARQUET' ou FORMAT = 'DELTA' (SQL Server 2022 (16.x) e versões posteriores, Azure SQL)
Permissão necessária ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, mais INSERT na tabela alvo ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS
Registo mínimo Yes. Suportado em modelos de recuperação simples ou logados em massa com TABLOCK Yes. Suportado quando usado com INSERT ... SELECT e TABLOCK

Quando escolher BULK INSERT

Use BULK INSERT quando tiver um carregamento simples de ficheiro para tabela e não precisar de transformar, filtrar ou juntar dados durante a importação. Utiliza uma sintaxe mais simples para ficheiros CSV ou outros ficheiros delimitados:

Esta consulta de exemplo carrega um ficheiro CSV do Azure Blob Storage diretamente para 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 ficheiro local com um ficheiro de formato para mapeamento de colunas.

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:

  • Consulta ou pré-visualiza dados de ficheiros sem criar uma tabela primeiro.
  • Transformar, filtrar ou juntar dados durante a importação.
  • Carregar ficheiros Parquet ou Delta (só OPENROWSET suporta estes formatos).
  • Importar um ficheiro inteiro como um único valor LOB (SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB).

Esta consulta de exemplo pré-visualiza um ficheiro CSV do Azure Blob Storage sem inserir os dados em lado nenhum.

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

Sugestão

Uma abordagem é começar com OPENROWSET(BULK ...) em SELECT para explorar e validar dados de ficheiros, depois mudar para BULK INSERT para a carga de produção final, caso não necessite de transformações. Se precisar de suporte para Parquet ou Delta ou filtragem inline, permaneça com OPENROWSET.

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

Funções úteis de metadados

Quando consulta ficheiros externos com OPENROWSET ou tabelas externas, pode usar várias funções e procedimentos incorporados para inspecionar metadados de ficheiros, descobrir esquemas e implementar consultas conscientes de partições.

filepath() e filename()

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

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

  • Exposição dos metadados de origem: Inclua o nome ou caminho do ficheiro 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 ficheiro (incluindo extensão) do ficheiro fonte para cada linha sales_2025_01.parquet
filepath(N) O n-ésimo segmento da pasta a partir do coringa (*) no caminho BULK, onde N começa em 1 Para o caminho sales/2025/01/*.parquet, filepath(1) retorna 2025, filepath(2) retorna 01

Aplica-se a: Azure SQL Database, Azure SQL Managed Instance, SQL Server 2022 (16.x) e versões posteriores, base de dados SQL em Fabric.

Esta consulta de exemplo serve filepath() para eliminação de partições e filename() para identificar ficheiros fonte. Só lê ficheiros na /2025/ pasta e só lê ficheiros 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';

Sugestão

Coloque filepath() filtros na WHERE cláusula em vez de numa subconsulta ou CTE. Quando o filtro está na WHERE cláusula, o motor de processamento pode eliminar partições ao nível da leitura de ficheiro, o que reduz significativamente a entrada/saída.

sp_describe_first_result_set - descobrir os tipos de colunas do OPENROWSET

Quando utiliza OPENROWSET com ficheiros Parquet, o motor de processamento 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 caracteres são frequentemente inferidas como varchar(8000) porque os metadados do Parquet não incluem um comprimento máximo. Esta escolha pode degradar o desempenho e consumir mais memória.

sp_describe_first_result_set Use para inspecionar o esquema inferido antes de finalizar a sua consulta. Depois de veres os tipos inferidos, especifica tipos mais restritos numa WITH cláusula para melhorar o desempenho.

  • Passo 1: Inspecionar 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, tipo de dado inferido, comprimento máximo, precisão e escala. Se você vir varchar(8000) onde varchar(100) seria suficiente, substitua-o:

  • Passo 2: Use tipos explícitos para melhor 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 ficheiros Parquet. Para ficheiros CSV, especifique sempre definições de coluna numa WITH cláusula (para OPENROWSET) ou na CREATE EXTERNAL TABLE instrução. sp_describe_first_result_set é um procedimento geral de SQL Server e Azure SQL, mas é especialmente útil para OPENROWSET consultas. Para mais informações, consulte sp_describe_first_result_set.

Desempenho, resolução de problemas e melhores práticas

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

Area Artigo Detalhes
Desempenho do PolyBase Considerações de desempenho no PolyBase para SQL Server Estatísticas, pushdown, paralelismo e gestão de memória
Cálculo por empurramento Cálculos de pushdown no PolyBase Especifica quais operações são enviadas para a fonte remota
Como saber se houve um empurrão Como saber se ocorreu um empurrão externo Planos de consulta e Visões de Gestão Dinâmica (DMVs)
Troubleshooting Monitorar e solucionar problemas do PolyBase Erros comuns e resoluções
Conectividade Kerberos Solucionar problemas de conectividade Kerberos do PolyBase
Perguntas Frequentes Perguntas frequentes da PolyBase
Erros e soluções erros do PolyBase e possíveis soluções