(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como carregar dados com COPY INTO no Azure Synapse

João Barros 10 de July de 2026 4 min de leitura

O comando COPY INTO é a forma mais rápida e simples de carregar ficheiros CSV ou Parquet do teu Data Lake para uma tabela de um Dedicated SQL Pool no Azure Synapse. Numa única instrução T-SQL substituis pipelines complexos e obténs uma ingestão de alto desempenho, sem provisionar recursos extra. Vais aprender a preparar a tabela de destino, escrever o comando COPY INTO e validar os dados carregados.

Pré-requisitos

  • Um Dedicated SQL Pool ativo no teu workspace do Azure Synapse.
  • Ficheiros de dados (CSV ou Parquet) numa conta de Azure Data Lake Storage Gen2 ou Blob Storage.
  • Permissões de escrita na base de dados e acesso de leitura ao armazenamento (por exemplo, através de uma Managed Identity).
  • Um editor SQL: o Synapse Studio, o Azure Data Studio ou o SQL Server Management Studio (SSMS).

Passo 1: Criar a tabela de destino

Antes de carregar dados, precisas de uma tabela cujas colunas correspondam às do ficheiro, pela mesma ordem. Escolhe os tipos de dados com cuidado: colunas demasiado largas desperdiçam memória e degradam o desempenho no Dedicated SQL Pool. Neste exemplo usamos DISTRIBUTION = ROUND_ROBIN, que reparte as linhas de forma uniforme — uma boa escolha para tabelas de staging — e um CLUSTERED COLUMNSTORE INDEX, ideal para grandes volumes analíticos.

CREATE TABLE dbo.Sales
(
    SaleID      INT            NOT NULL,
    SaleDate    DATE           NOT NULL,
    Product     NVARCHAR(100)  NOT NULL,
    Quantity    INT            NOT NULL,
    Amount      DECIMAL(10,2)  NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);

Passo 2: Configurar o acesso ao armazenamento

O COPY INTO precisa de autenticação para ler os ficheiros. A opção mais simples e segura é a Managed Identity do workspace. Basta atribuir ao workspace o papel Storage Blob Data Contributor na conta de armazenamento, no portal do Azure. Assim não geres chaves nem segredos dentro do código.

Dica: a Managed Identity evita guardar chaves de armazenamento no teu SQL. É a abordagem recomendada em ambientes de produção.

Passo 3: Executar o COPY INTO

Com a tabela criada e as permissões atribuídas, corre o comando. Este exemplo carrega todos os ficheiros Parquet de uma pasta do Data Lake:

COPY INTO dbo.Sales
FROM 'https://mystorageaccount.dfs.core.windows.net/data/sales/'
WITH
(
    FILE_TYPE = 'PARQUET',
    CREDENTIAL = (IDENTITY = 'Managed Identity')
);

Quando aponta para uma pasta, o COPY INTO lê todos os ficheiros lá dentro; para um único ficheiro, indica o caminho completo. Se os teus dados estiverem em CSV com cabeçalho, indica o tipo de ficheiro e salta a primeira linha:

COPY INTO dbo.Sales
FROM 'https://mystorageaccount.dfs.core.windows.net/data/sales.csv'
WITH
(
    FILE_TYPE = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '0x0A'
);

FIRSTROW = 2 ignora a linha de cabeçalho; FIELDTERMINATOR define o separador de colunas e ROWTERMINATOR o fim de linha.

Passo 4: Lidar com linhas com erro

Ficheiros reais têm quase sempre valores inesperados. Usa a opção ERRORFILE para que as linhas rejeitadas sejam guardadas em vez de fazerem falhar todo o carregamento:

COPY INTO dbo.Sales
FROM 'https://mystorageaccount.dfs.core.windows.net/data/sales.csv'
WITH
(
    FILE_TYPE = 'CSV',
    FIRSTROW = 2,
    MAXERRORS = 10,
    ERRORFILE = 'https://mystorageaccount.dfs.core.windows.net/rejected/'
);

Com MAXERRORS = 10, o carregamento continua até 10 linhas inválidas; acima disso, falha. As linhas problemáticas ficam na pasta indicada em ERRORFILE, para que as possas analisar mais tarde.

Verificar o resultado

Depois de correr o comando, confirma quantas linhas entraram na tabela:

SELECT COUNT(*) AS TotalRows FROM dbo.Sales;

Compara o número com o total esperado dos ficheiros. Podes também espreitar alguns registos com SELECT TOP 10 * FROM dbo.Sales; para confirmar que as colunas ficaram alinhadas e os tipos corretos. Se vires um erro de conversão, revê os tipos da tabela ou o separador do CSV.

Conclusão

Com o COPY INTO tens um método de ingestão rápido, seguro e sem infraestrutura adicional para alimentar o teu Dedicated SQL Pool. A partir daqui, podes agendar este comando dentro de um Synapse Pipeline para automatizar cargas diárias, ou combiná-lo com uma tabela de staging antes de aplicares transformações. Já pensaste em que coluna do teu ficheiro daria a melhor chave de distribuição?