Conectar, consultar e exportar dados com o PolyBase

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Base de Dados SQL do Azure 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. 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.

Suporte da plataforma

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

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 a partir do SQL Server 2019. Para a disponibilidade de funcionalidades no SQL Server 2016 e no SQL Server 2017 no Windows, consulte funcionalidades e limitações do PolyBase. 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 Base de Dados SQL do Azure 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 Armazenamento de Blobs do Azure Sim Sim Sim Sim Sim No
Liga-te à ADLS Gen2 Sim 5 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 âmbito de base de dados tem como alvo o endpoint SQL. Use os mesmos passos que para ligar a outra instância do SQL Server.

4 A autenticação por Identidade Gerida é suportada para ligação ao Armazenamento de Blobs do Azure (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 Base de Dados SQL do Azure e no Azure SQL Managed Instance.

5 versões do SQL Server 2019 CU11 e posteriores suportam o Azure Data Lake Storage Gen2 com o abfs prefixo 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, Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no Microsoft Fabric.
  • OPENROWSET (BULK)é suportado no SQL Server 2019, SQL Server 2022, SQL Server 2025, Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no Microsoft Fabric. O SQL Server 2019 suporta caminhos de ficheiros locais e de rede, enquanto o SQL Server 2022 e versões posteriores também suportam a leitura de armazenamento na nuvem com FORMAT = 'PARQUET', FORMAT = DELTA, e FORMAT = 'CSV'.
  • A exportação CETAS não é suportada no SQL Server 2019, Base de Dados SQL do Azure ou SQL Database no Microsoft Fabric. A exportação CETAS é suportada no SQL Server 2022, SQL Server 2025 e Azure SQL Managed Instance.
  • Ficheiros CSV e delimitados são suportados no SQL Server 2019, SQL Server 2022, SQL Server 2025, Base de Dados SQL do Azure, Azure SQL Managed Instance e base 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.
  • Os ficheiros Parquet não são suportados no SQL Server 2019. Os ficheiros Parquet são suportados no SQL Server 2022, SQL Server 2025, Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no Microsoft Fabric.
  • As tabelas Delta Lake não são suportadas no SQL Server 2019, Base de Dados SQL do Azure, Azure SQL Managed Instance ou SQL Database no Microsoft Fabric. As tabelas Delta Lake são suportadas no SQL Server 2022 e no SQL Server 2025.
  • A ligação a outra instância do SQL Server é suportada no SQL Server 2019, SQL Server 2022 e SQL Server 2025. A ligação a outra instância do SQL Server não é suportada pelo Base de Dados SQL do Azure, Azure SQL Managed Instance ou base de dados SQL no Microsoft Fabric.
  • A ligação ao Base de Dados SQL do Azure ou ao Azure SQL Managed Instance é suportada a partir do SQL Server 2019, SQL Server 2022 e SQL Server 2025, utilizando o conector SQL Server. A credencial com âmbito de base de dados visa o endpoint Base de Dados SQL do Azure ou Azure SQL Managed Instance, e os passos de configuração são os mesmos que para ligar a outra instância do SQL Server. Estas ligações não são suportadas pelo Base de Dados SQL do Azure, Azure SQL Managed Instance ou base de dados SQL no Microsoft Fabric.
  • A ligação ao Oracle, Teradata ou MongoDB é suportada a partir do SQL Server 2019, SQL Server 2022 e SQL Server 2025. Estas ligações não são suportadas pelo Base de Dados SQL do Azure, Azure SQL Managed Instance ou base de dados SQL no Microsoft Fabric.
  • A ligação ao Armazenamento de Blobs do Azure é suportada pelo SQL Server 2019, SQL Server 2022, SQL Server 2025, Base de Dados SQL do Azure e Azure SQL Managed Instance. A ligação ao Armazenamento de Blobs do Azure não é suportada a partir da base de dados SQL no Microsoft Fabric.
  • A ligação ao ADLS Gen2 não é suportada nas versões do SQL Server 2019 anteriores ao CU11 nem a partir da base de dados SQL no Microsoft Fabric. A ligação ao ADLS Gen2 é suportada a partir do SQL Server 2019 CU11, e no SQL Server 2022, SQL Server 2025, Base de Dados SQL do Azure e Azure SQL Managed Instance.
  • A ligação a armazenamento compatível com S3 não é suportada pelo SQL Server 2019, Base de Dados SQL do Azure, Azure SQL Managed Instance ou base de dados SQL no Microsoft Fabric. A ligação ao armazenamento compatível com S3 é suportada a partir do SQL Server 2022 e do SQL Server 2025.
  • A ligação ao OneLake é suportada a partir da base de dados SQL no Microsoft Fabric. A ligação ao OneLake não é suportada no SQL Server 2019, SQL Server 2022, SQL Server 2025, Base de Dados SQL do Azure ou Azure SQL Managed Instance.
  • A computação pushdown é suportada no SQL Server 2019, SQL Server 2022 e SQL Server 2025. A computação pushdown não é suportada no Base de Dados SQL do Azure, Azure SQL Managed Instance ou SQL Database no Microsoft Fabric.
  • A autenticação de Identidade Gerida não é suportada no SQL Server 2019 ou no SQL Server 2022. A autenticação de Identidade Gerida é suportada no SQL Server 2025 para ligações ao Armazenamento de Blobs do Azure e ADLS Gen2, e requer SQL Server ou SQL Server ativados com Azure Arc numa máquina virtual Azure. A autenticação de Identidade Gerida também é suportada no Base de Dados SQL do Azure e no Azure SQL Managed Instance, mas não é suportada na base de dados SQL do Microsoft Fabric.

Observação

A partir do SQL Server 2025 (17.x), consultar ficheiros de dados (CSV, Parquet e Delta) no Armazenamento de Blobs do Azure, 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 Instalação do PolyBase necessária
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
Consultas ad hoc em ficheiros 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 SQL Server 2022: Sim 1

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

Base de Dados SQL do Azure, Azure SQL Managed Instance e SQL Database in Fabric: Incorporado
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

1 Para aceder a ficheiros cloud no SQL Server 2022 (16.x), deve instalar a funcionalidade 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. O SQL Server 2025 (17.x) e versões posteriores têm suporte nativo para CSV, Parquet e Delta sem necessidade de instalar ou executar serviços PolyBase.

  • As 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. Podem usar autenticação SQL, Windows authentication ou Microsoft Entra ID com MSOLEDBSQL. Este cenário não requer instalação de PolyBase.
  • Consultas ad hoc em ficheiros servem OPENROWSET(BULK ...) para explorar rapidamente os dados do ficheiro ou testar um esquema antes de criar uma tabela. Podem usar tokens SAS, chaves de acesso, Managed Identity ou Microsoft Entra ID. O SQL Server 2022 exige a instalação da funcionalidade PolyBase para ficheiros cloud, mas não requer serviços PolyBase. O SQL Server 2025 e versões posteriores não requerem PolyBase para ficheiros na cloud. As consultas ad hoc de ficheiro estão integradas no Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no Fabric.
  • Conectores de dados persistentes utilizam CREATE EXTERNAL TABLE com sqlserver://, oracle://, teradata://, e locais semelhantes para acesso recorrente, governação, estatísticas e computação pushdown em cargas de trabalho de produção. Exigem autenticação SQL e serviços PolyBase.

Guia de decisão

Scenario Recommendation
Precisa de autenticação Microsoft Entra ID para SQL remoto, ou quer evitar os serviços PolyBase. Use OPENROWSET(MSOLEDBSQL, ...) (ad hoc, sem objetos persistentes).
Precisas de tabelas persistentes, estatísticas ou cálculo por empurrar para bases de dados remotas. Use CREATE EXTERNAL TABLE com conectores PolyBase (sqlserver://, oracle://, teradata://, mongodb://, odbc://). OPENROWSET Não suporta conectores.
Estás a explorar um novo ficheiro ou a testar um esquema. Use OPENROWSET(BULK ...) (iteração rápida, sem objetos persistentes).
Estás a ingerir dados de ficheiros numa tabela com transformações. Use INSERT ... SELECT a partir de OPENROWSET(BULK ...).
É necessário governar ou ter acesso partilhado para muitos utilizadores ou aplicações. Use CREATE EXTERNAL TABLE para que as permissões e os metadados fiquem centralizados.
Estás a trabalhar em bases de dados SQL no Fabric. Use OPENROWSET(BULK ...) para consultas OneLake ad hoc ou tabelas externas para acesso reutilizável; para armazenamento externo, use atalhos OneLake.
  • Se precisar de autenticação Microsoft Entra ID para SQL remoto ou quiser evitar os serviços PolyBase, utilize OPENROWSET(MSOLEDBSQL, ...) consultas remotas ad hoc sem objetos persistentes.
  • Se precisar de tabelas persistentes, estatísticas ou cálculo pushdown para bases de dados remotas, use CREATE EXTERNAL TABLE com conectores PolyBase como sqlserver://, oracle://, teradata://, mongodb://, e odbc://. OPENROWSET Não suporta estes conectores.
  • Se estiveres a explorar um novo ficheiro ou a testar um esquema, usa OPENROWSET(BULK ...) para iteração rápida e sem objetos persistentes.
  • Se estiver a ingerir dados de ficheiros numa tabela com transformações, use INSERT ... SELECT from OPENROWSET(BULK ...).
  • Se precisar de governação ou acesso partilhado para muitos utilizadores ou aplicações, use CREATE EXTERNAL TABLE as permissões e metadados centralizados.
  • Se estiveres a trabalhar em base de dados SQL no Fabric, usa OPENROWSET(BULK ...) consultas ad hoc no OneLake ou tabelas externas para acesso reutilizável, e usa atalhos do OneLake para armazenamento externo.

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 Armazenamento de Blobs do Azure, 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, Base de Dados SQL do Azure, 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, Base de Dados SQL do Azure, 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, Base de Dados SQL do Azure, 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
  • Para uma consulta rápida e ad hoc num ficheiro Parquet ou CSV, use OPENROWSET. Este método não requer uma mesa externa. O SQL Server 2022 (16.x) e versões posteriores, Base de Dados SQL do Azure, Azure SQL Managed Instance e SQL Database no Fabric suportam este padrão.
  • Para consultas repetidas em ficheiros Parquet com um esquema persistente, use uma tabela externa sobre Parquet. O SQL Server 2022 (16.x) e versões posteriores, Base de Dados SQL do Azure, Azure SQL Managed Instance e SQL Database no Fabric suportam este padrão.
  • Para uma consulta em ficheiros CSV, use uma tabela externa com um formato de ficheiro para texto delimitado. SQL Server 2019 (15.x) e versões posteriores, Base de Dados SQL do Azure, Azure SQL Managed Instance e SQL database no Fabric suportam este padrão.
  • Para uma consulta em tabelas Delta Lake, use uma tabela externa com FILE_FORMAT = DeltaLakeFileFormat. O SQL Server 2022 (16.x) e versões posteriores suportam este padrão.
  • Para exportar resultados de consulta para ficheiros Parquet ou CSV, use CREATE EXTERNAL TABLE AS SELECT. O SQL Server 2022 (16.x) e versões posteriores e o Azure SQL Managed Instance suportam este padrão.

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) Base de Dados SQL do Azure 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, Base de Dados SQL do Azure 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, Base de Dados SQL do Azure 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>
    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 âmbito de base de dados com o login alvo usando CREATE DATABASE SCOPED CREDENTIAL para que o motor possa autenticar-se 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>.

Sugestão

O conector SQL Server (sqlserver://) também funciona para Base de Dados SQL do Azure e Azure SQL Managed Instance. Use os mesmos passos e defina LOCATION para o endpoint Base de Dados SQL do Azure ou Azure SQL Managed Instance (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 Armazenamento de Blobs do Azure 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 Armazenamento de Blobs do Azure
SQL Server 2019 (15.x) Chave de acesso (via conector Hadoop) Configure o PolyBase para aceder a dados externos no Armazenamento de Blobs do Azure
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:

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

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 Armazenamento de Blobs do Azure, 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. 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.
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 referência Transact-SQL, ver CREATE EXTERNAL TABLE AS 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, Base de Dados SQL do Azure, 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 Armazenamento de Blobs do Azure

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

  • 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 saltar este passo se usar Identidade Gerida ou autenticação Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<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 = '<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é métodos de consulta (External Table, OPENROWSET, BULK INSERT, CETAS).

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 precisas CREATE MASTER KEY?

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

Sugestão

Se a sua CREATE DATABASE SCOPED CREDENTIAL declaração não incluir um segredo, não precisa 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 = '<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 de ficheiros no SQL Server 2022 (16.x) e SQL Server 2019 (15.x) 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 1; Não para local SQL Server 2022 (16.x) e SQL Server 2019 (15.x)
Consultas de ficheiros no SQL Server 2025 (17.x) e versões posteriores OPENROWSET(BULK ...) Ficheiros em disco local, rede ou cloud (Azure Blob, ADLS, S3, OneLake) Token SAS, chave de acesso, Identidade Gerida, Microsoft Entra ID No SQL Server 2022 (16.x) e versões posteriores, Base de Dados SQL do Azure, Azure SQL Managed Instance, SQL database in Fabric
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)

1 Para o acesso a ficheiros na nuvem no SQL Server 2022 (16.x), a funcionalidade PolyBase deve estar instalada.

  • As consultas OLE DB são usadas OPENROWSET(provider, connection, query) para se ligar a qualquer fonte OLE DB através de MSOLEDBSQL, SQLOLEDB ou outro fornecedor em todas as versões suportadas do SQL Server. Eles suportam autenticação SQL, Windows authentication e Microsoft Entra ID com MSOLEDBSQL, e não exigem que os serviços PolyBase sejam instalados.
  • As consultas de ficheiros são usadas OPENROWSET(BULK ...) para ler ficheiros em disco local, partilhas de rede ou armazenamento na nuvem, como Armazenamento de Blobs do Azure, ADLS, S3 ou OneLake, utilizando um token SAS, chave de acesso, Managed Identity ou Microsoft Entra ID. São suportados para ficheiros locais e de rede no SQL Server 2005 e versões posteriores, para ficheiros cloud no SQL Server 2022 (16.x) e versões posteriores, e no Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no Fabric. As consultas de ficheiros não requerem serviços PolyBase para ficheiros locais ou para ficheiros cloud no SQL Server 2022 (16.x) e versões posteriores.
  • Os conectores PolyBase utilizam CREATE EXTERNAL TABLE com CREATE EXTERNAL DATA SOURCE e o sqlserver://, oracle://, teradata://, mongodb://, ou odbc:// localização para se ligar a fontes remotas SQL Server, Oracle, Teradata, MongoDB ou ODBC. Exigem autenticação SQL e serviços PolyBase no SQL Server 2019 (15.x) e versões posteriores para Windows e SQL Server 2025 (17.x) e versões posteriores para Linux. Para mais informações, vejaCREATE 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 Managed Identity através do MSOLEDBSQL.
  • Use o OLE DB OPENROWSET para evitar dependências de serviços PolyBase.
  • Use o OLE DB OPENROWSET para se ligar a qualquer fonte de dados que tenha um fornecedor OLE DB.

Use o ficheiro OPENROWSET(BULK) para:

  • Use ficheiros OPENROWSET(BULK ...) para exploração de ficheiros ad hoc e descoberta de esquemas.
  • Usa o ficheiro OPENROWSET(BULK ...) para transformações rápidas e pré-visualizações antes de te comprometeres com uma definição de tabela.
  • Use o ficheiro OPENROWSET(BULK ...) para transformações flexíveis de colunas inline, como casting, filtragem e colunas computadas.
  • Use ficheiro OPENROWSET(BULK ...) para dados que não mudam frequentemente e que não necessitam de metadados persistentes.

Utilize conectores do PolyBase com CREATE EXTERNAL TABLE para:

  • Use conectores PolyBase com CREATE EXTERNAL TABLE definições de tabelas persistentes e reutilizáveis que vários utilizadores ou aplicações acedam.
  • Use conectores PolyBase para CREATE EXTERNAL TABLE cargas de trabalho de produção que exijam estatísticas e otimização do plano de consultas.
  • Utilize conectores PolyBase para CREATE EXTERNAL TABLE cálculo por pressão para fontes remotas como Oracle e SQL Server.
  • Use conectores PolyBase com CREATE EXTERNAL TABLE para governação partilhada e segurança; após a criação da tabela, os utilizadores só SELECT precisam de permissão.
  • Use conectores PolyBase quando CREATE EXTERNAL TABLE a autenticação SQL estiver 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 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 ficheiro Parquet com um caminho inline (Base de Dados SQL do Azure, 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 Managed Instance: estatísticas manuais de coluna única via sys.sp_create_openrowset_statistics. Consulte as estatísticas do manual do OPENROWSET.

SQL Server 2022 (16.x) e versões posteriores, Base de Dados SQL do Azure, SQL database em Fabric: autocriar estatísticas em predicados. Estatísticas manuais OPENROWSET não são suportadas no SQL Server.
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
  • OPENROWSET(BULK ...) é melhor para exploração ad hoc e consultas pontuais, enquanto uma tabela externa é melhor para definições de tabelas persistentes e reutilizáveis.
  • OPENROWSET(BULK ...) não armazena metadados na base 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 ficheiro como objetos da base de dados.
  • OPENROWSET(BULK ...) infere o esquema automaticamente a partir de um ficheiro Parquet ou define o esquema em linha com uma WITH cláusula, enquanto uma tabela externa define explicitamente o esquema na CREATE EXTERNAL TABLE instrução.
  • OPENROWSET(BULK ...) requer ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS, enquanto uma tabela externa pode ser consultada por utilizadores que só necessitam de permissão padrão SELECT depois de a tabela existir.
  • OPENROWSET(BULK ...) suporta colunas computadas nas funções de consulta e metadados como filename() e filepath(), enquanto uma tabela externa tem uma lista de colunas fixa e requer transformações numa vista ou na consulta que lê a tabela externa.
  • OPENROWSET(BULK ...)tem suporte limitado para estatísticas: o Azure SQL Managed Instance 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 Base 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 suportadas no SQL Server, Base de Dados SQL do Azure e SQL Database no Fabric. Uma tabela externa suporta capacidade total CREATE STATISTICS em todas as plataformas, além de estatísticas automáticas no SQL Server 2022 (16.x) e versões posteriores, Base de Dados SQL do Azure e SQL Database no Fabric. Consulte estatísticas do manual OPENROWSET e Criar estatísticas do manual de tabelas externas.
  • OPENROWSET(BULK ...) tem pushdown limitado e nenhum pushdown para fontes remotas de RDBMS, enquanto uma tabela externa suporta computação por 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 partilhado, 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 Base de Dados SQL do Azure, 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

A instrução autónoma BULK INSERT não é suportada na base de dados SQL no Fabric. Para ingerir dados, use INSERT ... SELECT contra OPENROWSET(BULK ...) 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 nuvem DATA_SOURCEsuporta Armazenamento de Blobs do Azure no SQL Server 2017 (14.x) e versões posteriores, Base de Dados SQL do Azure e Azure SQL Managed Instance. 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. Base de Dados SQL do Azure e Azure SQL Managed Instance suportam Armazenamento de Blobs do Azure e ADLS Gen2. A base de dados SQL no Fabric suporta OneLake e armazenamento externo através de atalhos OneLake.
Arquivos de Parquet ou Delta Não suportado. Apenas CSV/texto delimitado Yes. SQL Server 2022 (16.x) e versões posteriores, suporte para Azure SQL Managed Instance e Base de Dados SQL do Azure FORMAT = 'PARQUET' e FORMAT = 'DELTA'; Suporte para base de dados SQL em FabricFORMAT = '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 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
  • BULK INSERTcarrega os dados de um ficheiro diretamente numa tabela de destino, enquanto OPENROWSET(BULK ...) devolve um conjunto de linhas que pode usar numa SELECT instrução ou.INSERT ... SELECT
  • BULK INSERT é uma instrução autónoma, 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 escreve sempre diretamente numa tabela alvo, enquanto OPENROWSET(BULK ...) pode SELECT ser inserido a partir de um ficheiro sem inserir em lado nenhum ou inserir em qualquer tabela ou tabela temporária.
  • BULK INSERT tem suporte limitado para transformações de coluna porque os dados fluem do ficheiro para a tabela as-is, com o mapeamento controlado por um ficheiro de formato ou ordem de colunas. OPENROWSET(BULK ...) suporta expressões, CAST, WHERE filtros, JOINs e colunas calculadas na área circundante SELECT.
  • BULK INSERT usa uma WITH cláusula para BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK, , e outras dicas. OPENROWSET(BULK ...) suporta dicas de tabela através de INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...).
  • BULK INSERT não suporta importação de valor único para objetos grandes. OPENROWSET(BULK ...) suporta SINGLE_BLOB, SINGLE_CLOB, e SINGLE_NCLOB para importar um ficheiro inteiro como um valor varbinary(max),varchar(max) ou nvarchar(max ), respetivamente.
  • Ambos BULK INSERT suportam OPENROWSET(BULK ...) ficheiros em formato XML e não XML.
  • Para acesso a ficheiros na cloud com BULK INSERT, o DATA_SOURCE parâmetro suporta Armazenamento de Blobs do Azure no SQL Server 2017 (14.x) e versões posteriores, Base de Dados SQL do Azure e Azure SQL Managed Instance. 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. Base de Dados SQL do Azure e Azure SQL Managed Instance suportam Armazenamento de Blobs do Azure e ADLS Gen2. A base de dados SQL no Fabric suporta OneLake e armazenamento externo através de atalhos OneLake.
  • BULK INSERT não suporta ficheiros Parquet ou Delta e suporta apenas CSV ou texto delimitado. OPENROWSET(BULK ...)suporta FORMAT = 'PARQUET' e FORMAT = 'DELTA' no SQL Server 2022 (16.x) e versões posteriores, Base de Dados SQL do Azure e Azure SQL Managed Instance. A base 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 mais INSERT permissão na tabela alvo, enquanto OPENROWSET(BULK ...) requer ADMINISTER BULK OPERATIONS ou ADMINISTER DATABASE BULK OPERATIONS.
  • BULK INSERT suporta registo mínimo sob o modelo de recuperação simples ou logada em massa com TABLOCK. OPENROWSET(BULK ...) suporta registos mínimos 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 Armazenamento de Blobs do Azure 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:

  • Use OPENROWSET(BULK ...) para consultar ou pré-visualizar dados de ficheiros sem criar uma tabela primeiro.
  • Use OPENROWSET(BULK ...) para transformar, filtrar ou juntar dados durante a importação.
  • Uso OPENROWSET(BULK ...) para carregar ficheiros Parquet ou Delta porque BULK INSERT não suporta estes formatos.
  • Use OPENROWSET(BULK ...) para importar um ficheiro inteiro como um único valor LOB com SINGLE_BLOB, SINGLE_CLOB, ou SINGLE_NCLOB.

Esta consulta de exemplo pré-visualiza um ficheiro CSV do Armazenamento de Blobs do Azure 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 usando OPENROWSET ou tabelas externas, utilize as 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: Base de Dados SQL do Azure, 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 vires varchar(8000), onde um varchar(100) seria suficiente, anula-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 SQL Server geral, Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no procedimento Fabric, 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