Partilhar via


CRIAR TABELA EXTERNA COMO SELECIONAR (CETAS) (Transact-SQL)

Aplica-se a: SQL Server 2022 (16.x) e posterior Azure Synapse AnalyticsAnalytics Platform System (PDW)

Cria uma tabela externa e, em seguida, exporta, em paralelo, os resultados de uma instrução Transact-SQL SELECT.

  • O Azure Synapse Analytics e o Analytics Platform System suportam armazenamento Hadoop ou Blob do Azure.
  • O SQL Server 2022 (16.x) e versões posteriores dão suporte ao CREATE EXTERNAL TABLE AS SELECT (CETAS) para criar uma tabela externa e, em seguida, exportar, em paralelo, o resultado de uma instrução SELECT Transact-SQL para o Azure Data Lake Storage (ADLS) Gen2, a Conta de Armazenamento do Azure V2 e o armazenamento de objetos compatível com o S3.

Observação

Os recursos e a segurança do CETAS para Instância Gerenciada SQL do Azure são diferentes do SQL Server ou do Azure Synapse Analytics. Para obter mais informações, consulte a versão da Instância Gerenciada SQL do Azure do CREATE EXTERNAL TABLE AS SELECT.

Observação

Os recursos e a segurança do CETAS para pools sem servidor no Azure Synapse Analytics são diferentes do SQL Server. Para obter mais informações, consulte CETAS com Synapse SQL.

Transact-SQL convenções de sintaxe

Sintaxe

CREATE EXTERNAL TABLE { [ [ database_name . [ schema_name ] . ] | schema_name . ] table_name }
    [ (column_name [ , ...n ] ) ]
    WITH (
        LOCATION = 'hdfs_folder' | '<prefix>://<path>[:<port>]' ,
        DATA_SOURCE = external_data_source_name ,
        FILE_FORMAT = external_file_format_name
        [ , <reject_options> [ , ...n ] ]
    )
    AS <select_statement>
[;]

<reject_options> ::=
{
    | REJECT_TYPE = value | percentage
    | REJECT_VALUE = reject_value
    | REJECT_SAMPLE_VALUE = reject_sample_value
}

<select_statement> ::=
    [ WITH <common_table_expression> [ , ...n ] ]
    SELECT <select_criteria>

Argumentos

[ [ database_name . [ schema_name ] . ] | schema_name . ] table_name

O nome de uma a três partes da tabela a ser criada no banco de dados. Para uma tabela externa, o banco de dados relacional armazena apenas os metadados da tabela.

[ ( column_name [ ,... n ] ) ]

O nome de uma coluna de tabela.

LOCALIZAÇÃO

Aplica-se a: Azure Synapse Analytics and Analytics Platform System

'hdfs_folder'**
Especifica onde gravar os resultados da instrução SELECT na fonte de dados externa. O local é um nome de pasta e, opcionalmente, pode incluir um caminho relativo à pasta raiz do cluster Hadoop ou do armazenamento de Blob. O PolyBase cria o caminho e a pasta, caso ainda não exista.

Os arquivos externos são gravados em hdfs_folder e nomeados QueryID_date_time_ID.format, onde ID é um identificador incremental e format é o formato de dados exportado. Um exemplo é QID776_20160130_182739_0.orc.

LOCATION deve apontar para uma pasta e ter um /à direita, por exemplo: aggregated_data/.

Aplica-se a: SQL Server 2022 (16.x) e posterior

prefix://path[:port] fornece o protocolo de conectividade (prefixo), caminho e, opcionalmente, a porta, para a fonte de dados externa, onde o resultado da instrução SELECT será gravado.

Se o destino for o armazenamento de objetos compatível com o S3, um bucket deve existir primeiro, mas o PolyBase pode criar subpastas, se necessário. O SQL Server 2022 (16.x) dá suporte ao Azure Data Lake Storage Gen2, à Conta de Armazenamento do Azure V2 e ao armazenamento de objetos compatíveis com o S3. Os arquivos ORC não são suportados no momento.

DATA_SOURCE = external_data_source_name

Especifica o nome do objeto de fonte de dados externa que contém o local onde os dados externos são armazenados ou serão armazenados. O local é um cluster Hadoop ou um armazenamento de Blob do Azure. Para criar uma fonte de dados externa, use CREATE EXTERNAL DATA SOURCE (Transact-SQL).

FILE_FORMAT = external_file_format_name

Especifica o nome do objeto de formato de arquivo externo que contém o formato para o arquivo de dados externo. Para criar um formato de arquivo externo, use CREATE EXTERNAL FILE FORMAT (Transact-SQL).

Opções REJEITAR

As opções REJEITAR não se aplicam no momento em que esta instrução CREATE EXTERNAL TABLE AS SELECT é executada. Em vez disso, eles são especificados aqui para que o banco de dados possa usá-los em um momento posterior quando importar dados da tabela externa. Mais tarde, quando a instrução CREATE TABLE AS SELECT selecionar dados da tabela externa, o banco de dados usará as opções de rejeição para determinar o número ou a porcentagem de linhas que podem falhar na importação antes de interromper a importação.

  • REJECT_VALUE = reject_value

    Especifica o valor ou a porcentagem de linhas que podem falhar na importação antes que o banco de dados interrompa a importação.

  • REJECT_TYPE = valor | percentagem

    Esclarece se a opção REJECT_VALUE é um valor literal ou uma porcentagem.

    • valor

      Usado se REJECT_VALUE for um valor literal, não uma porcentagem. O banco de dados para de importar linhas do arquivo de dados externo quando o número de linhas com falha excede reject_value.

      Por exemplo, se REJECT_VALUE = 5 e REJECT_TYPE = value, o banco de dados para de importar linhas depois que cinco linhas não conseguem importar.

    • percentagem

      Usado se REJECT_VALUE for uma porcentagem, não um valor literal. O banco de dados para de importar linhas do arquivo de dados externo quando a porcentagem de linhas com falha excede reject_value. A percentagem de linhas com falha é calculada em intervalos. Válido apenas em pools SQL dedicados quando TYPE=HADOOP.

  • REJECT_SAMPLE_VALUE = reject_sample_value

    Necessário quando REJECT_TYPE = percentage. Especifica o número de linhas a serem importadas antes que o banco de dados recalcule a porcentagem de linhas com falha.

    Por exemplo, se REJECT_SAMPLE_VALUE = 1000, o banco de dados calculará a porcentagem de linhas com falha depois de tentar importar 1000 linhas do arquivo de dados externo. Se a porcentagem de linhas com falha for menor que reject_value, o banco de dados tentará carregar outras 1.000 linhas. O banco de dados continua a recalcular a porcentagem de linhas com falha depois de tentar importar cada 1.000 linhas adicionais.

    Observação

    Como o banco de dados calcula a porcentagem de linhas com falha em intervalos, a porcentagem real de linhas com falha pode exceder reject_value.

    Exemplo:

    Este exemplo mostra como as três opções REJECT interagem entre si. Por exemplo, se REJECT_TYPE = percentage, REJECT_VALUE = 30, REJECT_SAMPLE_VALUE = 100, o seguinte cenário pode ocorrer:

    • O banco de dados tenta carregar as primeiras 100 linhas, das quais 25 falham e 75 são bem-sucedidas.
    • A porcentagem de linhas com falha é calculada como 25%, que é menor do que o valor de rejeição de 30%. Assim, não há necessidade de interromper a carga.
    • O banco de dados tenta carregar as próximas 100 linhas. Desta vez, 25 são bem-sucedidos e 75 fracassam.
    • A porcentagem de linhas com falha é recalculada como 50%. A porcentagem de linhas com falha excedeu o valor de rejeição de 30%.
    • A carga falha com 50% linhas com falha depois de tentar carregar 200 linhas, o que é maior do que o limite de 30% especificado.

COM common_table_expression

Especifica um conjunto de resultados nomeado temporário, conhecido como uma expressão de tabela comum (CTE). Para obter mais informações, consulte COM common_table_expression (Transact-SQL)

SELECIONAR <select_criteria>

Preenche a nova tabela com os resultados de uma instrução SELECT. select_criteria é o corpo da instrução SELECT que determina quais dados copiar para a nova tabela. Para obter informações sobre instruções SELECT, consulte SELECT (Transact-SQL).

Observação

A cláusula ORDER BY em SELECT não produz efeitos no CETAS.

Opções de coluna

  • column_name [ ,... n ]

    Os nomes das colunas não permitem as opções de coluna mencionadas em CREATE TABLE. Em vez disso, você pode fornecer uma lista opcional de um ou mais nomes de coluna para a nova tabela. As colunas na nova tabela usam os nomes especificados. Quando você especifica nomes de colunas, o número de colunas na lista de colunas deve corresponder ao número de colunas nos resultados selecionados. Se você não especificar nenhum nome de coluna, a nova tabela de destino usará os nomes de coluna nos resultados da instrução select.

    Não é possível especificar outras opções de coluna, como tipos de dados, agrupamento ou anulabilidade. Cada um desses atributos é derivado dos resultados da instrução SELECT. No entanto, você pode usar a instrução SELECT para alterar os atributos. Para obter um exemplo, consulte Usar CETAS para alterar atributos de coluna.

Permissões

Para executar esse comando, o usuário do banco de dados precisa de todas estas permissões ou associações:

  • ALTER SCHEMA permissão no esquema local que conterá a nova tabela ou associação na função de banco de dados fixa db_ddladmin.
  • CREATE TABLE permissão ou associação na função de banco de dados fixa db_ddladmin.
  • SELECT permissão em quaisquer objetos referenciados no select_criteria.

O login precisa de todas estas permissões:

  • ADMINISTRAR OPERAÇÕES EM MASSA
  • ALTERAR QUALQUER FONTE DE DADOS EXTERNA
  • ALTERAR QUALQUER FORMATO DE ARQUIVO EXTERNO
  • Em geral, você precisa ter permissões para o conteúdo da pasta List e Gravar na pasta LOCATION do CETAS.
  • No Azure Synapse Analytics and Analytics Platform System, permissão Gravar para ler e gravar na pasta externa no cluster Hadoop ou no armazenamento de Blob do Azure.
  • No SQL Server 2022 (16.x), também é necessário definir permissões adequadas no local externo. Gravar permissão para enviar os dados para o local e permissão de leitura para acessá-los.
  • Para o Armazenamento de Blobs do Azure e o Azure Data Lake Gen2, o token de SHARED ACCESS SIGNATURE deve receber os seguintes privilégios no contêiner: de leitura, Write, ListCreate.
  • Para o Armazenamento de Blog do Azure, a caixa de seleção Allowed Services: Blob deve ser marcada para gerar o token SAS.
  • Para o Azure Data Lake Gen2, as caixas de seleção Allowed Services: Container e Object devem ser selecionadas para gerar o token SAS.

Importante

A permissão ALTER ANY EXTERNAL DATA SOURCE concede a qualquer entidade de segurança a capacidade de criar e modificar qualquer objeto de fonte de dados externa, portanto, também concede a capacidade de acessar todas as credenciais de escopo do banco de dados no banco de dados. Essa permissão deve ser considerada altamente privilegiada e deve ser concedida apenas a entidades confiáveis no sistema.

Tratamento de erros

Quando CREATE EXTERNAL TABLE AS SELECT exporta dados para um arquivo delimitado por texto, não há nenhum arquivo de rejeição para linhas que não conseguem exportar.

Quando você cria a tabela externa, o banco de dados tenta se conectar ao local externo. Se a conexão falhar, o comando falhará e a tabela externa não será criada. Pode levar um minuto ou mais para que o comando falhe porque o banco de dados tenta novamente a conexão pelo menos três vezes.

Se CREATE EXTERNAL TABLE AS SELECT for cancelado ou falhar, o banco de dados fará uma tentativa única de remover quaisquer novos arquivos e pastas já criados na fonte de dados externa.

No Azure Synapse Analytics and Analytics Platform System, o banco de dados relata quaisquer erros Java que ocorram na fonte de dados externa durante a exportação de dados.

Comentários

Depois que a instrução CREATE EXTERNAL TABLE AS SELECT for concluída, você poderá executar consultas Transact-SQL na tabela externa. Essas operações importam dados para o banco de dados durante a consulta, a menos que você importe usando a instrução CREATE TABLE AS SELECT.

O nome e a definição da tabela externa são armazenados nos metadados do banco de dados. Os dados são armazenados na fonte de dados externa.

A instrução CREATE EXTERNAL TABLE AS SELECT sempre cria uma tabela não particionada, mesmo que a tabela de origem seja particionada.

Para o SQL Server 2022 (16.x), a opção allow polybase export deve ser habilitada usando sp_configure. Para obter mais informações, consulte opção Definir allow polybase export configuração.

Para planos de consulta no Azure Synapse Analytics and Analytics Platform System, criados com EXPLAIN, o banco de dados usa estas operações de plano de consulta para tabelas externas: Movimentação aleatória externa, Movimentação de difusão externa, Movimentação de partição externa.

No Analytics Platform System, como pré-requisito para criar uma tabela externa, o administrador do dispositivo precisa configurar a conectividade do Hadoop. Para obter mais informações, consulte "Configurar conectividade com dados externos (Analytics Platform System)" na documentação do Analytics Platform System, que você pode baixar do Centro de Download da Microsoft.

Limitações e restrições

Como os dados da tabela externa residem fora do banco de dados, as operações de backup e restauração operam apenas nos dados armazenados no banco de dados. Como resultado, apenas os metadados são copiados e restaurados.

O banco de dados não verifica a conexão com a fonte de dados externa ao restaurar um backup de banco de dados que contém uma tabela externa. Se a fonte original não estiver acessível, a restauração de metadados da tabela externa ainda terá êxito, mas as operações SELECT na tabela externa falharão.

O banco de dados não garante a consistência dos dados entre o banco de dados e os dados externos. Você, o cliente, é o único responsável por manter a consistência entre os dados externos e o banco de dados.

As operações de linguagem de manipulação de dados (DML) não são suportadas em tabelas externas. Por exemplo, você não pode usar as instruções Transact-SQL atualizar, inserir ou excluir Transact-SQL para modificar os dados externos.

CREATE TABLE, DROP TABLE, CREATE STATISTICS, DROP STATISTICS, CREATE VIEW e DROP VIEW são as únicas operações de linguagem de definição de dados (DDL) permitidas em tabelas externas.

Limitações e restrições do Azure Synapse Analytics

  • Nos pools SQL dedicados do Azure Synapse Analytics e no Analytics Platform System, o PolyBase pode consumir um máximo de 33.000 arquivos por pasta ao executar 32 consultas PolyBase simultâneas. Este número máximo inclui ficheiros e subpastas em cada pasta HDFS. Se o grau de simultaneidade for inferior a 32, um usuário poderá executar consultas PolyBase em pastas no HDFS que contenham mais de 33.000 arquivos. Recomendamos que os usuários do Hadoop e do PolyBase mantenham os caminhos de arquivos curtos e não usem mais de 30.000 arquivos por pasta HDFS. Quando muitos arquivos são referenciados, ocorre uma exceção de falta de memória da JVM.

  • Em pools SQL sem servidor, as tabelas externas não podem ser criadas em um local onde você tem dados no momento. Para reutilizar um local que tenha sido usado para armazenar dados, o local deve ser excluído manualmente no ADLS. Para obter mais limitações e práticas recomendadas, consulte Práticas recomendadas de otimização de filtros.

Nos pools SQL dedicados do Azure Synapse Analytics e no Analytics Platform System, quando CREATE EXTERNAL TABLE AS SELECT seleciona a partir de um RCFile, os valores de coluna no RCFile não devem conter o caractere pipe (|).

SET ROWCOUNT (Transact-SQL) não tem efeito em CREATE EXTERNAL TABLE AS SELECT. Para obter um comportamento semelhante, use TOP (Transact-SQL).

Analise de nomenclatura e referência de contêineres, blobs e metadados para obter limitações nos nomes de arquivos.

Erros de caracteres

Os seguintes caracteres presentes nos dados podem causar erros, incluindo registros rejeitados com CREATE EXTERNAL TABLE AS SELECT para arquivos Parquet.

No Azure Synapse Analytics and Analytics Platform System, isso também se aplica a arquivos ORC.

  • |
  • " (caractere de aspas)
  • \r\n
  • \r
  • \n

Para usar CREATE EXTERNAL TABLE AS SELECT que contenham esses caracteres, você deve primeiro executar a instrução CREATE EXTERNAL TABLE AS SELECT para exportar os dados para arquivos de texto delimitados, onde você pode convertê-los em Parquet ou ORC usando uma ferramenta externa.

Trabalhar com parquet

Ao trabalhar com arquivos de parquet, CREATE EXTERNAL TABLE AS SELECT gerará um arquivo de parquet por CPU disponível, até o grau máximo de paralelismo configurado (MAXDOP). Cada arquivo pode crescer até 190 GB, depois disso o SQL Server gerará mais arquivos Parquet, conforme necessário.

A dica de consulta OPTION (MAXDOP n) afetará apenas a parte SELECT do CREATE EXTERNAL TABLE AS SELECT. Não tem qualquer influência sobre o número de ficheiros de parquet. Somente MAXDOP no nível do banco de dados e MAXDOP no nível da instância são considerados.

Bloqueio

Usa um bloqueio compartilhado no objeto SCHEMARESOLUTION.

Tipos de dados suportados

O CETAS pode ser usado para armazenar conjuntos de resultados com os seguintes tipos de dados SQL:

  • binário
  • Varbinary
  • char
  • Varchar
  • Nchar
  • Nvarchar
  • data pequena
  • data
  • datetime
  • datetime2
  • datetimeoffset
  • Hora
  • decimais
  • numérico
  • flutuar
  • reais
  • bigint
  • tinyint
  • Smallint
  • Int
  • bigint
  • bit
  • dinheiro
  • dinheiro pequeno

Exemplos

Um. Criar uma tabela Hadoop usando CREATE EXTERNAL TABLE AS SELECT

Aplica-se a: Azure Synapse Analytics and Analytics Platform System

O exemplo a seguir cria uma nova tabela externa chamada hdfsCustomer que usa as definições de coluna e os dados da tabela de origem dimCustomer.

A definição de tabela é armazenada no banco de dados e os resultados da instrução SELECT são exportados para o arquivo /pdwdata/customer.tbl na fonte de dados externa do Hadoop customer_ds. O arquivo é formatado de acordo com o formato de arquivo externo customer_ff.

O nome do arquivo é gerado pelo banco de dados e contém a ID da consulta para facilitar o alinhamento do arquivo com a consulta que o gerou.

O caminho que hdfs://xxx.xxx.xxx.xxx:5000/files/ precede o diretório Customer já deve existir. Se o diretório Customer não existir, o banco de dados criará o diretório.

Observação

Este exemplo especifica para 5000. Se a porta não for especificada, o banco de dados usará 8020 como a porta padrão.

O local e o nome do arquivo do Hadoop resultantes serão hdfs:// xxx.xxx.xxx.xxx:5000/files/Customer/ QueryID_YearMonthDay_HourMinutesSeconds_FileIndex.txt..

-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE hdfsCustomer
    WITH (
            LOCATION = '/pdwdata/customer.tbl',
            DATA_SOURCE = customer_ds,
            FILE_FORMAT = customer_ff
            ) AS

SELECT *
FROM dimCustomer;
GO

B. Use uma dica de consulta com CREATE EXTERNAL TABLE AS SELECT

Aplica-se a: Azure Synapse Analytics and Analytics Platform System

Esta consulta mostra a sintaxe básica para usar uma dica de junção de consulta com a instrução CREATE EXTERNAL TABLE AS SELECT. Depois que a consulta é enviada, o banco de dados usa a estratégia de junção de hash para gerar o plano de consulta. Para obter mais informações sobre dicas de junção e como usar a cláusula OPTION, consulte OPTION Clause (Transact-SQL).

Observação

Este exemplo especifica para 5000. Se a porta não for especificada, o banco de dados usará 8020 como a porta padrão.

-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE dbo.FactInternetSalesNew
    WITH (
            LOCATION = '/files/Customer',
            DATA_SOURCE = customer_ds,
            FILE_FORMAT = customer_ff
            ) AS

SELECT T1.*
FROM dbo.FactInternetSales T1
INNER JOIN dbo.DimCustomer T2
    ON (T1.CustomerKey = T2.CustomerKey)
OPTION (HASH JOIN);
GO

C. Utilizar o CETAS para alterar atributos de coluna

Aplica-se a: Azure Synapse Analytics and Analytics Platform System

Este exemplo usa CETAS para alterar tipos de dados, anulabilidade e agrupamento de várias colunas na tabela FactInternetSales.

-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE dbo.FactInternetSalesNew
    WITH (
            LOCATION = '/files/Customer',
            DATA_SOURCE = customer_ds,
            FILE_FORMAT = customer_ff
            ) AS

SELECT T1.ProductKey AS ProductKeyNoChange,
    T1.OrderDateKey AS OrderDate,
    T1.ShipDateKey AS ShipDate,
    T1.CustomerKey AS CustomerKeyNoChange,
    T1.OrderQuantity AS Quantity,
    T1.SalesAmount AS MONEY
FROM dbo.FactInternetSales T1
INNER JOIN dbo.DimCustomer T2
    ON (T1.CustomerKey = T2.CustomerKey)
OPTION (HASH JOIN);
GO

D. Use CREATE EXTERNAL TABLE AS SELECT exportando dados como parquet

Aplica-se a: SQL Server 2022 (16.x)

O exemplo a seguir cria uma nova tabela externa chamada ext_sales que usa os dados da tabela SalesOrderDetail de AdventureWorks2022. A opção permitir a configuração de exportação de polibase deve ser habilitada.

O resultado da instrução SELECT será salvo no armazenamento de objetos compatível com o S3 previamente configurado e nomeado s3_edse na credencial adequada criada como s3_dsc. O local do arquivo parquet será <ip>:<port>/cetas/sales.parquet onde cetas é o bucket de armazenamento criado anteriormente.

Observação

Atualmente, o formato delta é suportado apenas como somente leitura.

-- Credential to access the S3-compatible object storage
CREATE DATABASE SCOPED CREDENTIAL s3_dsc
    WITH IDENTITY = 'S3 Access Key',
        SECRET = '<accesskeyid>:<secretkeyid>'
GO

-- S3-compatible object storage data source
CREATE EXTERNAL DATA SOURCE s3_eds
    WITH (
            LOCATION = 's3://<ip>:<port>',
            CREDENTIAL = s3_dsc
            )

-- External File Format for PARQUET
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
    WITH (FORMAT_TYPE = PARQUET);
GO

CREATE EXTERNAL TABLE ext_sales
    WITH (
            LOCATION = '/cetas/sales.parquet',
            DATA_SOURCE = s3_eds,
            FILE_FORMAT = ParquetFileFormat
            ) AS

SELECT *
FROM AdventureWorks2022.[Sales].[SalesOrderDetail];
GO

E. Use CREATE EXTERNAL TABLE AS SELECT da tabela delta para o parquet

Aplica-se a: SQL Server 2022 (16.x)

O exemplo a seguir cria uma nova tabela externa chamada Delta_to_Parquet, que usa o tipo de dados Delta Table localizados em um armazenamento de objetos compatível com o S3 chamado s3_deltae grava o resultado em outra fonte de dados chamada s3_parquet como um arquivo parquet. Para isso, o exemplo faz uso do comando OPENROWSET. A opção permitir a configuração de exportação de polibase deve ser habilitada.

-- External File Format for PARQUET
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
    WITH (FORMAT_TYPE = PARQUET);
GO

CREATE EXTERNAL TABLE Delta_to_Parquet
    WITH (
            LOCATION = '/backup/sales.parquet',
            DATA_SOURCE = s3_parquet,
            FILE_FORMAT = ParquetFileFormat
            ) AS

SELECT *
FROM OPENROWSET(BULK '/delta/sales_fy22/', FORMAT = 'DELTA', DATA_SOURCE = 's3_delta') AS [r];
GO

F. Use CREATE EXTERNAL TABLE AS SELECT com um modo de exibição como fonte

Aplica-se a: pools SQL sem servidor do Azure Synapse Analytics e pools SQL dedicados.

Use o exemplo a seguir como um modelo para escrever CETAS com uma exibição definida pelo usuário como origem, usando uma identidade gerenciada para autenticação e o ponto de extremidade abfs::

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
    LOCATION = 'abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path>/<file_name>',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SynapseSQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

G. Use CREATE EXTERNAL TABLE AS SELECT com um modo de exibição como fonte

Aplica-se a: pools SQL sem servidor do Azure Synapse Analytics e pools SQL dedicados.

Neste exemplo, podemos ver exemplo de um código de modelo para escrever CETAS com uma exibição definida pelo usuário como fonte, usando identidade gerenciada como uma autenticação e https:.

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
    LOCATION = 'https://<mystoageaccount>.dfs.core.windows.net/<mycontainer>/<mybaseoutputfolderpath>',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SynapseSQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

Próximos passos

Aplica-se a: de Instância Gerenciada SQL do Azure

Cria uma tabela externa e, em seguida, exporta, em paralelo, os resultados de uma instrução Transact-SQL SELECT.

Pode utilizar o CREATE EXTERNAL TABLE AS SELECT (CETAS) para concluir as seguintes tarefas:

  • Crie uma tabela externa sobre arquivos Parquet ou CSV no armazenamento de Blob do Azure ou no Azure Data Lake Storage (ADLS) Gen2.
  • Exporte, em paralelo, os resultados de uma instrução T-SQL SELECT para a tabela externa criada.
  • Para obter mais recursos de virtualização de dados da Instância Gerenciada SQL do Azure, consulte Virtualização de dados com a Instância Gerenciada SQL do Azure.

Observação

Este conteúdo aplica-se apenas à Instância Gerida SQL do Azure. Para outras plataformas, escolha a versão apropriada do CREATE EXTERNAL TABLE AS SELECT no seletor suspenso.

Transact-SQL convenções de sintaxe

Sintaxe

CREATE EXTERNAL TABLE [ [database_name  . [ schema_name ] . ] | schema_name . ] table_name
    WITH (
        LOCATION = 'path_to_folder/',  
        DATA_SOURCE = external_data_source_name,  
        FILE_FORMAT = external_file_format_name
        [, PARTITION ( column_name [ , ...n ] ) ]
)
    AS <select_statement>  
[;]

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>

Argumentos

[ [ database_name . [ schema_name ] . ] | schema_name . ] table_name

O nome de uma a três partes da tabela a ser criada. Para uma tabela externa, apenas os metadados da tabela são armazenados. Nenhum dado real é movido ou armazenado.

LOCALIZAÇÃO = 'path_to_folder'

Especifica onde gravar os resultados da instrução SELECT na fonte de dados externa. A pasta raiz é o local de dados especificado na fonte de dados externa. LOCATION deve apontar para uma pasta e ter um /à direita. Exemplo: aggregated_data/.

A pasta de destino do CETAS deve estar vazia. Se o caminho e a pasta ainda não existirem, eles serão criados automaticamente.

DATA_SOURCE = external_data_source_name

Especifica o nome do objeto de fonte de dados externa que contém o local onde os dados externos serão armazenados. Para criar uma fonte de dados externa, use CREATE EXTERNAL DATA SOURCE (Transact-SQL).

FILE_FORMAT = external_file_format_name

Especifica o nome do objeto de formato de arquivo externo que contém o formato para o arquivo de dados externo. Para criar um formato de arquivo externo, use CREATE EXTERNAL FILE FORMAT (Transact-SQL). Apenas formatos de arquivo externos com FORMAT_TYPE=PARQUET e FORMAT_TYPE=DELIMITEDTEXT são suportados atualmente. A compactação GZip para o formato DELIMITEDTEXT não é suportada.

[, PARTITION ( nome da coluna [ , ... n ] ) ]

Particiona os dados de saída em vários caminhos de arquivo parquet. O particionamento acontece por determinadas colunas (column_name), combinando os curingas (*) na coluna LOCATION com a respetiva coluna de particionamento. O número de colunas na parte PARTITION deve corresponder ao número de curingas no LOCATION. Deve haver pelo menos uma coluna que não seja usada para particionamento.

COM <common_table_expression>

Especifica um conjunto de resultados nomeado temporário, conhecido como uma expressão de tabela comum (CTE). Para obter mais informações, consulte WITH common_table_expression (Transact-SQL).

SELECIONAR <select_criteria>

Preenche a nova tabela com os resultados de uma instrução SELECT. select_criteria é o corpo da instrução SELECT que determina quais dados copiar para a nova tabela. Para obter informações sobre instruções SELECT, consulte SELECT (Transact-SQL).

Observação

A cláusula ORDER BY em SELECT não é suportada no CETAS.

Permissões

Permissões no armazenamento

Você precisa ter permissões para listar o conteúdo da pasta e gravar no caminho LOCATION para que o CETAS funcione.

Os métodos de autenticação suportados são a identidade gerenciada ou um token SAS (Assinatura de Acesso Compartilhado).

  • Se você estiver usando a identidade gerenciada para autenticação, verifique se a entidade de serviço da sua instância gerenciada SQL tem uma função de de Colaborador de Dados de Blob de Armazenamento no contêiner de destino.
  • Se você estiver usando um token SAS, de leitura, de gravação e lista permissões são necessárias.
  • Para o Armazenamento de Blog do Azure, a caixa de seleção Allowed Services: Blob deve ser marcada para gerar o token SAS.
  • Para o Azure Data Lake Gen2, as caixas de seleção Allowed Services: Container e Object devem ser selecionadas para gerar o token SAS.

Não há suporte para uma identidade gerenciada atribuída pelo usuário. A autenticação de passagem do Microsoft Entra não é suportada. Microsoft Entra ID é (anteriormente Azure Ative Directory).

Permissões na instância gerenciada do SQL

Para executar esse comando, o usuário do banco de dados precisa de todas estas permissões ou associações:

  • ALTER SCHEMA permissão no esquema local que conterá a nova tabela ou associação na função de banco de dados fixa db_ddladmin.
  • CREATE TABLE permissão ou associação na função de banco de dados fixa db_ddladmin.
  • SELECT permissão em quaisquer objetos referenciados no select_criteria.

O login precisa de todas estas permissões:

  • ADMINISTRAR OPERAÇÕES EM MASSA
  • ALTERAR QUALQUER FONTE DE DADOS EXTERNA
  • ALTERAR QUALQUER FORMATO DE ARQUIVO EXTERNO

Importante

A permissão ALTER ANY EXTERNAL DATA SOURCE concede a qualquer entidade de segurança a capacidade de criar e modificar qualquer objeto de fonte de dados externa, portanto, também concede a capacidade de acessar todas as credenciais de escopo do banco de dados no banco de dados. Essa permissão deve ser considerada altamente privilegiada e deve ser concedida apenas a entidades confiáveis no sistema.

Tipos de dados suportados

O CETAS armazena conjuntos de resultados com os seguintes tipos de dados SQL:

  • binário
  • Varbinary
  • char
  • Varchar
  • Nchar
  • Nvarchar
  • PequenoDateTime
  • data
  • datetime
  • datetime2
  • datetimeoffset
  • Hora
  • decimais
  • numérico
  • flutuar
  • reais
  • bigint
  • tinyint
  • Smallint
  • Int
  • bigint
  • bit
  • dinheiro
  • dinheiro pequeno

Observação

LOBs maiores que 1MB não podem ser usados com CETAS.

Limitações e restrições

  • CREATE EXTERNAL TABLE AS SELECT (CETAS) para Instância Gerenciada SQL do Azure está desabilitada por padrão. Para obter mais informações, consulte a próxima seção, Desabilitado por padrão.
  • Para obter mais informações sobre limitações ou problemas conhecidos com a virtualização de dados na Instância Gerenciada SQL do Azure, consulte Limitações e problemas conhecidos.

Como os dados da tabela externa residem fora do banco de dados, as operações de backup e restauração operam apenas nos dados armazenados no banco de dados. Como resultado, apenas os metadados são copiados e restaurados.

O banco de dados não verifica a conexão com a fonte de dados externa ao restaurar um backup de banco de dados que contém uma tabela externa. Se a fonte original não estiver acessível, a restauração de metadados da tabela externa ainda terá êxito, mas as operações SELECT na tabela externa falharão.

O banco de dados não garante a consistência dos dados entre o banco de dados e os dados externos. Você, o cliente, é o único responsável por manter a consistência entre os dados externos e o banco de dados.

As operações de linguagem de manipulação de dados (DML) não são suportadas em tabelas externas. Por exemplo, você não pode usar o Transact-SQL atualizar, inserir ou excluir Transact-SQLstatements para modificar os dados externos.

CREATE TABLE, DROP TABLE, CREATE STATISTICS, DROP STATISTICS, CREATE VIEW e DROP VIEW são as únicas operações de linguagem de definição de dados (DDL) permitidas em tabelas externas.

Não é possível criar tabelas externas em um local onde você tenha dados no momento. Para reutilizar um local que tenha sido usado para armazenar dados, o local deve ser excluído manualmente no ADLS.

SET ROWCOUNT (Transact-SQL) não tem efeito em CREATE EXTERNAL TABLE AS SELECT. Para obter um comportamento semelhante, use TOP (Transact-SQL).

Analise de nomenclatura e referência de contêineres, blobs e metadados para obter limitações nos nomes de arquivos.

Tipos de armazenamento

Os arquivos podem ser armazenados no Azure Data Lake Storage Gen2 ou no Armazenamento de Blobs do Azure. Para consultar arquivos, você precisa fornecer o local em um formato específico e usar o prefixo do tipo de local correspondente ao tipo de fonte externa e ponto de extremidade/protocolo, como os seguintes exemplos:

--Blob Storage endpoint
abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet

--Data Lake endpoint
adls://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet

Importante

O prefixo do tipo de local fornecido é usado para escolher o protocolo ideal para comunicação e para aproveitar quaisquer recursos avançados oferecidos pelo tipo de armazenamento específico. O uso do prefixo https:// genérico está desabilitado. Use sempre prefixos específicos do ponto de extremidade.

Desabilitado por padrão

CREATE EXTERNAL TABLE AS SELECT (CETAS) permite exportar dados de sua instância gerenciada SQL para uma conta de armazenamento externa, portanto, há potencial para risco de exfiltração de dados com esses recursos. Portanto, o CETAS está desabilitado por padrão para a Instância Gerenciada SQL do Azure.

Ativar o CETAS

O CETAS para Instância Gerenciada SQL do Azure só pode ser habilitado por meio de um método que exija permissões elevadas do Azure e não pode ser habilitado via T-SQL. Devido ao risco de exfiltração de dados não autorizada, o CETAS não pode ser habilitado por meio do procedimento armazenado T-SQL sp_configure, mas requer que a ação do usuário fora da instância gerenciada pelo SQL.

Permissões para ativar o CETAS

Para habilitar por meio do Azure PowerShell, o usuário que executa o comando deve ter de Colaborador ou funções do SQL Security Manager do Azure RBAC para sua instância gerenciada do SQL.

Uma função personalizada também pode ser criada para isso, exigindo o de leitura e ação Escrever para a ação Microsoft.Sql/managedInstances/serverConfigurationOptions.

Métodos para habilitar o CETAS

Para invocar os comandos do PowerShell em um computador, pacote Az versão 9.7.0 ou mais recente deve ser instalado localmente. Ou, considere usar o Azure Cloud Shell para executar o Azure PowerShell em shell.azure.com.

Primeiro, entre no Azure e defina o contexto adequado para sua assinatura:

Login-AzAccount
$SubscriptionID = "<YourSubscriptionIDHERE>"
Select-AzSubscription -SubscriptionName $SubscriptionID

Para gerenciar a opção de configuração do servidor allowPolybaseExport, ajuste os seguintes scripts do PowerShell à sua assinatura e ao nome da instância gerenciada SQL e execute os comandos. Para obter mais informações, consulte Set-AzSqlServerConfigurationOption e Get-AzSqlServerConfigurationOption.

# Enable ServerConfigurationOption with name "allowPolybaseExport"
Set-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport" -Value 1

Para desativar a opção de configuração do servidor "allowPolybaseExport":

# Disable ServerConfigurationOption with name "allowPolybaseExport"
Set-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport" -Value 0

Para obter o valor atual da opção de configuração do servidor "allowPolybaseExport":

# Get ServerConfigurationOptions with name "allowPolybaseExport"
Get-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport"

Verificar o estado do CETAS

A qualquer momento pode verificar o estado atual da opção de configuração do CETAS.

Conecte-se à sua instância gerenciada SQL. Execute o seguinte T-SQL e observe a coluna value da resposta. Quando a alteração da configuração do servidor estiver concluída, os resultados dessa consulta deverão corresponder à configuração desejada.

SELECT [name], [value] FROM sys.configurations WHERE name ='allow polybase export';

Solução de problemas

Para obter mais etapas para solucionar problemas de virtualização de dados na Instância Gerenciada SQL do Azure, consulte Solucionar problemas de. Seguem-se o tratamento de erros e mensagens de erro comuns para CETAS na Instância Gerida SQL do Azure.

Tratamento de erros

Quando CREATE EXTERNAL TABLE AS SELECT exporta dados para um arquivo delimitado por texto, não há nenhum arquivo de rejeição para linhas que não conseguem exportar.

Quando você cria a tabela externa, o banco de dados tenta se conectar ao local externo. Se a conexão falhar, o comando falhará e a tabela externa não será criada. Pode levar um minuto ou mais para que o comando falhe porque o banco de dados tenta novamente a conexão pelo menos três vezes.

Mensagens de erro comuns

Essas mensagens de erro comuns têm explicações rápidas para o CETAS para Instância Gerenciada SQL do Azure.

  1. Especificar um local já existente no armazenamento.

    Solução: limpe o local de armazenamento (incluindo instantâneo) ou altere o parâmetro de local na consulta.

    Exemplo de mensagem de erro: Msg 15842: Cannot create external table. External table location already exists.

  2. Valores de coluna formatados usando objetos JSON.

    Solução: converta a coluna de valor em uma única coluna VARCHAR ou NVARCHAR ou em um conjunto de colunas com tipos explicitamente definidos.

    Exemplo de mensagem de erro: Msg 16549: Values in column value are formatted as JSON objects and cannot be written using CREATE EXTERNAL TABLE AS SELECT.

  3. Parâmetro de localização inválido (por exemplo, vários //).

    Solução: corrija o parâmetro location.

    Exemplo de mensagem de erro: Msg 46504: External option 'LOCATION' is not valid. Ensure that the length and range are appropriate.

  4. Falta uma das opções necessárias (DATA_SOURCE, FILE_FORMAT, LOCALIZAÇÃO).

    Solução: Adicione o parâmetro em falta à consulta CETAS.

    Exemplo de mensagem de erro: Msg 46505: Missing required external DDL option 'FILE_FORMAT'

  5. Problemas de acesso (credencial inválida, credencial expirada ou credencial com permissões insuficientes). Possibilidade alternativa é um caminho inválido, onde a instância gerenciada SQL recebeu um erro 404 do armazenamento.

    Solução: verifique a validade e as permissões das credenciais. Como alternativa, valide se o caminho é válido e o armazenamento existe. Use o caminho da URL adls://<container>@<storage_account>.blob.core.windows.net/<path>/.

    Exemplo de mensagem de erro: Msg 15883: Access check for '<Read/Write>' operation against '<Storage>' failed with HRESULT = '0x...'

  6. A parte de localização do DATA_SOURCE contém curingas.

    Solução: remova curingas do local.

    Exemplo de mensagem de erro: Msg 16576: Location provided by DATA_SOURCE '<data source name>' cannot contain any wildcards.

  7. O número de curingas no parâmetro LOCATION e o número de colunas particionadas não correspondem.

    Solução: Garanta o mesmo número de curingas em LOCATION que as colunas de partição.

    Exemplo de mensagem de erro: Msg 16577: Number of wildcards in LOCATION must match the number of columns in PARTITION clause.

  8. O nome da coluna na cláusula PARTITION não corresponde a nenhuma coluna na lista.

    Solução: Certifique-se de que as colunas em PARTITION são válidas.

    Exemplo de mensagem de erro: Msg 16578: The column name '<column name>' specified in the PARTITION option does not match any column specified in the column list

  9. Coluna especificada mais de uma vez na lista PARTITION.

    Solução: Certifique-se de que as colunas na cláusula PARTITION são exclusivas.

    Exemplo de mensagem de erro: Msg 16579: A column has been specified more than once in the PARTITION list. Column '<column name>' is specified more than once.

  10. A coluna foi especificada mais de uma vez na lista PARTITION ou não corresponde a nenhuma coluna da lista SELECT.

    Solução: Certifique-se de que não há duplicatas na lista de partições e que as colunas de partição existem na parte SELECT.

    Exemplos de mensagens de erro: Msg 11569: Column <column name> has been specified more than once in the partition columns list. Please try again with a valid parameter. ou Msg 11570: Column <column name> specified in the partition columns list does not match any columns in SELECT clause. Please try again with a valid parameter.

  11. Usando todas as colunas na lista PARTITION.

    Solução: Pelo menos uma das colunas da parte SELECT não deve estar na parte PARTITION da consulta.

    Exemplo de mensagem de erro: Msg 11571: All output columns in DATA_EXPORT query are declared as PARTITION columns. DATA_EXPORT query requires at least one column to export.

  12. O recurso está desativado.

    Solução: habilite o recurso usando a seção desativado por padrão neste artigo.

    Exemplo de mensagem de erro: Msg 46552: Writing into an external table is disabled. See 'https://go.microsoft.com/fwlink/?linkid=2201073' for more information

Bloqueio

Usa um bloqueio compartilhado no objeto SCHEMARESOLUTION.

Exemplos

Um. Usar o CETAS com vista a criar uma tabela externa usando a identidade gerenciada

Este exemplo fornece código para escrever CETAS com uma exibição como origem, usando identidade gerenciada pelo sistema e autenticação.

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SQLwriteable] WITH (
    LOCATION = 'adls://container@mystorageaccount.blob.core.windows.net/mybaseoutputfolderpath',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

B. Utilizar o CETAS com vista a criar uma tabela externa com autenticação SAS

Este exemplo fornece código para escrever CETAS com uma exibição como origem, usando um token SAS como autenticação.

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL SAS_token
WITH
  IDENTITY = 'SHARED ACCESS SIGNATURE',
  -- Remove ? from the beginning of the SAS token
  SECRET = '<azure_shared_access_signature>' ;
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SQLwriteable] WITH (
    LOCATION = 'adls://container@mystorageaccount.blob.core.windows.net/mybaseoutputfolderpath',
    CREDENTIAL = [SAS_token]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

C. Criar uma tabela externa em um único arquivo de parquet no armazenamento

Os dois exemplos a seguir mostram como descarregar alguns dos dados de uma tabela local em uma tabela externa armazenada como arquivo(s) parquet no contêiner de armazenamento de Blob do Azure. Eles são projetados para trabalhar com AdventureWorks2022 banco de dados. Este exemplo mostra a criação de uma tabela externa como um único arquivo parquet, onde o próximo exemplo mostra como criar uma tabela externa e particioná-la em várias pastas com arquivos parquet.

O exemplo abaixo funciona usando identidade gerenciada para autenticação. Como tal, certifique-se de que a entidade de serviço da Instância Gerida SQL do Azure tem função de Colaborador de Dados de Blob de Armazenamento no seu Contentor de Armazenamento de Blobs do Azure. Como alternativa, você pode modificar o exemplo e usar tokens SAS (Segredo de Acesso Compartilhado) para autenticação.

No exemplo a seguir, você cria uma tabela externa em um único arquivo de parquet no Armazenamento de Blobs do Azure, selecionando SalesOrderHeader partir de tabela para pedidos anteriores a 1-Jan-2014:

--Example 1: Creating an external table into a single parquet file on the storage, selecting from SalesOrderHeader table for orders older than 1-Jan-2014:
USE [AdventureWorks2022]
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Strong Password';
GO

CREATE DATABASE SCOPED CREDENTIAL [CETASCredential]
    WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL DATA SOURCE [CETASExternalDataSource]
WITH (
    LOCATION = 'abs://container@storageaccount.blob.core.windows.net',
    CREDENTIAL = [CETASCredential] );
GO

CREATE EXTERNAL FILE FORMAT [CETASFileFormat]
WITH(
    FORMAT_TYPE=PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
    );
GO

-- Count how many rows we plan to offload
SELECT COUNT(*) FROM [AdventureWorks2022].[Sales].[SalesOrderHeader] WHERE
        OrderDate < '2013-12-31';

-- CETAS write to a single file, archive all data older than 1-Jan-2014:
CREATE EXTERNAL TABLE SalesOrdersExternal
WITH (
    LOCATION = 'SalesOrders/',
    DATA_SOURCE = [CETASExternalDataSource],
    FILE_FORMAT = [CETASFileFormat])
AS 
    SELECT 
        *
    FROM 
        [AdventureWorks2022].[Sales].[SalesOrderHeader]
    WHERE
        OrderDate < '2013-12-31';

-- you can query the newly created external table
SELECT COUNT (*) FROM SalesOrdersExternal;

D. Criar uma tabela externa particionada em vários arquivos parquet armazenados em uma árvore de pastas

Este exemplo baseia-se no exemplo anterior para mostrar como criar uma tabela externa e particioná-la em várias pastas com arquivos parquet. Você pode usar tabelas particionadas para obter benefícios de desempenho se o conjunto de dados for grande.

Crie uma tabela externa a partir de SalesOrderHeader dados, usando as etapas do Exemplo B, mas particione a tabela externa por OrderDate ano e mês. Ao consultar tabelas externas particionadas, podemos nos beneficiar da eliminação de partições para desempenho.

--CETAS write to a folder hierarchy (partitioned table):
CREATE EXTERNAL TABLE SalesOrdersExternalPartitioned
WITH (
    LOCATION = 'PartitionedOrders/year=*/month=*/', 
    DATA_SOURCE = CETASExternalDataSource,
    FILE_FORMAT = CETASFileFormat,
    --year and month will correspond to the two respective wildcards in folder path    
    PARTITION (
        [Year],
        [Month]
        ) 
    )
AS
    SELECT
        *,
        YEAR(OrderDate) AS [Year],
        MONTH(OrderDate) AS [Month]
    FROM [AdventureWorks2022].[Sales].[SalesOrderHeader]
    WHERE
        OrderDate < '2013-12-31';
GO

-- you can query the newly created partitioned external table
SELECT COUNT (*) FROM SalesOrdersExternalPartitioned;

Próximos passos