Compartilhar via


INSERÇÃO A GRANEL (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureWarehouse no Microsoft Fabric

Importa um arquivo de dados para uma tabela ou exibição de banco de dados em um formato especificado pelo usuário no SQL Server.

Convenções de sintaxe de Transact-SQL

Sintaxe

BULK INSERT
   { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
      FROM 'data_file'
     [ WITH
    (
   [ [ , ] DATA_SOURCE = 'data_source_name' ]

   -- text formatting options
   [ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
   [ [ , ] DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' } ]
   [ [ , ] ROWTERMINATOR = 'row_terminator' ]
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]
   [ [ , ] FORMAT = 'CSV' ]
   [ [ , ] FIELDQUOTE = 'quote_characters' ]

   [ [ , ] FIRSTROW = first_row ]
   [ [ , ] LASTROW = last_row ]

   -- input file format options
   [ [ , ] FORMATFILE = 'format_file_path' ]
   [ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]

   -- error handling options
   [ [ , ] MAXERRORS = max_errors ]
   [ [ , ] ERRORFILE = 'file_name' ]
   [ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]

   -- database options
   [ [ , ] KEEPIDENTITY ]
   [ [ , ] KEEPNULLS ]
   [ [ , ] FIRE_TRIGGERS ]
   [ [ , ] CHECK_CONSTRAINTS ]
   [ [ , ] TABLOCK ]

   -- source options
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch
   [ [ , ] BATCHSIZE = batch_size ]

    ) ]

Argumentos

A instrução BULK INSERT tem diferentes argumentos e opções em diferentes plataformas. As diferenças são resumidas na tabela a seguir:

Característica SQL Server Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure Data Warehouse do Fabric
Fonte de dados Caminho local, CAMINHO de rede (UNC) ou Armazenamento do Azure Armazenamento do Azure Armazenamento do Azure
Autenticação de origem Autenticação do Windows, SAS ID do Microsoft Entra, token SAS, identidade gerenciada Microsoft Entra ID
Opções sem suporte * curingas no caminho * curingas no caminho DATA_SOURCE, FORMATFILE_DATA_SOURCE, , ERRORFILEERRORFILE_DATA_SOURCE
Opções habilitadas, mas sem efeito KEEPIDENTITY, FIRE_TRIGGERS, CHECK_CONSTRAINTS, TABLOCK, ORDER, , ROWS_PER_BATCH, KILOBYTES_PER_BATCHe BATCHSIZE não são aplicáveis. Eles não lançam um erro de sintaxe, mas não têm nenhum efeito

database_name

É o nome do banco de dados no qual a tabela ou a exibição especificada reside. Caso não seja especificado, database_name é o banco de dados atual.

schema_name

Especifica o nome do esquema da tabela ou exibição. schema_name será opcional se o esquema padrão do usuário que está executando a operação de importação em massa for o esquema da tabela ou exibição especificada. Se esquema não for especificado e o esquema padrão do usuário que está executando a operação de importação em massa for diferente da tabela ou exibição especificada, o SQL Server retornará uma mensagem de erro e a operação de importação em massa será cancelada.

table_name

Especifica o nome da tabela ou exibição para a qual os dados serão importados em massa. Só podem ser usadas exibições nas quais todas as colunas se referem à mesma tabela base. Para obter mais informações sobre as restrições para carregar dados em exibições, consulte INSERT.

DE 'data_file'

Especifica o caminho completo do arquivo de dados que contém dados a serem importados na tabela ou exibição especificada. BULK INSERT pode importar dados de um disco ou do Armazenamento de Blobs do Azure (incluindo rede, disquete, disco rígido e assim por diante).

BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';

data_file deve especificar um caminho válido do servidor no qual o SQL Server é executado. Se data_file for um arquivo remoto, especifique o nome UNC. Um nome UNC tem o formato \\SystemName\ShareName\Path\FileName. Por exemplo:

BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';

O Banco de Dados SQL do Azure e o Fabric Warehouse dão suporte apenas à leitura do Armazenamento de Blobs do Azure.

Começando com o SQL Server 2017 (14.x) CTP1.1, o data_file pode estar localizado no Armazenamento de Blobs do Azure. Nesse caso, você também precisa especificar data_source_name opção. Para obter um exemplo, confira Como importar dados de um arquivo no Armazenamento de Blobs do Azure.

O Fabric Warehouse dá suporte a dois estilos de caminho diferentes para especificar o caminho de origem:

  • https://<storage account>.blob.core.windows.net/<container name>/<path to file>
  • abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>

O Fabric Warehouse dá suporte a caracteres curingas * que podem corresponder a qualquer caractere no URI e permitem que você defina um padrão de URI para os arquivos que devem ser importados. Por exemplo:

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';

Observação

Substitua por <data-lake>.blob.core.windows.net uma URL apropriada.

TAMANHO DO LOTE = batch_size

Especifica o número de linhas em um lote. Cada lote é copiado para o servidor como uma transação. Em caso de falha, o SQL Server confirmará ou reverterá a transação para cada lote. Por padrão, todos os dados no arquivo de dados especificado são um lote. Para saber mais sobre considerações de desempenho, confira Considerações de desempenho mais adiante neste artigo.

Verificação de Restrições

Especifica que todas as restrições na tabela ou exibição de destino devem ser verificadas durante a operação de importação em massa. Sem a opção CHECK_CONSTRAINTS , qualquer CHECK restrição é FOREIGN KEY ignorada e, após a operação, a restrição na tabela é marcada como não confiável.

UNIQUE e PRIMARY KEY restrições são sempre impostas. Ao importar para uma coluna de caractere definida com uma NOT NULL restrição, BULK INSERT insere uma cadeia de caracteres em branco quando não há nenhum valor no arquivo de texto.

Em algum momento, você deve examinar as restrições na tabela inteira. Se a tabela não estiver vazia antes da operação de importação em massa, o custo de revalidação da restrição poderá exceder o custo de aplicação CHECK de restrições aos dados incrementais.

Uma situação na qual talvez você queira desabilitar as restrições (o comportamento padrão) é quando os dados de entrada contiverem linhas que violam as restrições. Com CHECK as restrições desabilitadas, você pode importar os dados e, em seguida, usar instruções Transact-SQL para remover os dados inválidos.

Observação

A MAXERRORS opção não se aplica à verificação de restrição.

CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }

Especifica a página de código dos dados no arquivo de dados. CODEPAGE é relevante somente se os dados contiverem colunas char, varchar ou texto com valores de caractere maiores ou 127 menores que 32. Para obter um exemplo, confira Especificar uma página de código.

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (CODEPAGE = '65001', FIRSTROW = 2);

Observação

Substitua por <data-lake>.blob.core.windows.net uma URL apropriada.

CODEPAGE não é uma opção com suporte no Linux para SQL Server 2017 (14.x). Para o SQL Server 2019 (15.x), somente a opção 'RAW' é permitida.CODEPAGE

Você deve especificar um nome de ordenação para cada coluna em um arquivo de formato.

Valor CODEPAGE Descrição
ACP Colunas do tipo de dados char, varchar ou text são convertidas da página de código do Windows ANSI/Microsoft (ISO 1252) na página de código do SQL Server.
OEM (padrão) Colunas do tipo de dados char, varchar ou text são convertidas da página de código do sistema OEM para a página de código do SQL Server.
RAW Não ocorre nenhuma conversão de uma página de código para outra. RAW é a opção mais rápida.
code_page Especifique o número da página de código, por exemplo, 850.

As versões anteriores ao SQL Server 2016 (13.x) não dão suporte à página de código 65001 (codificação UTF-8).

TIPO DE ARQUIVO DE DADOS = { 'char' | 'nativo' | 'widechar' | 'widenative' }

Especifica que BULK INSERT executa a operação de importação usando o valor de tipo de arquivo de dados especificado.

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATAFILETYPE = 'char', FIRSTROW = 2);

Observação

Substitua por <data-lake>.blob.core.windows.net uma URL apropriada.

Valor DATAFILETYPE Todos os dados representados em
char (padrão) Formato de caractere.

Para obter mais informações, confira Usar o formato de caractere para importar ou exportar dados (SQL Server).
native Tipos de dados (banco de dados) nativo. Crie o arquivo de dados nativo importando dados em massa do SQL Server usando o utilitário bcp.

O valor nativo oferece uma alternativa de alto desempenho ao valor char. O formato nativo é recomendado quando você transfere dados em massa entre várias instâncias do SQL Server usando um arquivo de dados que não contém caracteres estendidos/DBCS (Conjunto de Caracteres de Byte Duplo).

Para obter mais informações, confira Usar um formato nativo para importar ou exportar dados (SQL Server).
widechar Caracteres Unicode.

Para obter mais informações, consulte Usar o formato de caractere Unicode para importar ou exportar dados (SQL Server).
widenative Tipos de dados nativos (banco de dados), exceto nas colunas char, varchar e text colunas, em que os dados são armazenados como Unicode. Crie o widenative arquivo de dados importando dados em massa do SQL Server usando o utilitário bcp .

O widenative valor oferece uma alternativa de desempenho mais alta para widechar. Se o arquivo de dados contiver caracteres estendidos ANSI, especifique widenative.

Para obter mais informações, confira Usar o formato nativo Unicode para importar ou exportar dados (SQL Server).

DATA_SOURCE = 'data_source_name'

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores e Banco de Dados SQL do Azure.

Especifica a fonte de dados externa nomeada apontando para o local de Armazenamento de Blobs do Azure do arquivo que será importado. A fonte de dados externa deve ser criada usando a opção TYPE = BLOB_STORAGE adicionada no SQL Server 2017 (14.x) CTP 1.1. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE. Para obter um exemplo, confira Como importar dados de um arquivo no Armazenamento de Blobs do Azure.

Observação

Substitua por <data-lake>.blob.core.windows.net uma URL apropriada.

CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://<data-lake>.blob.core.windows.net/public/'
);
GO

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = '<data-lake>', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');

ERRORFILE = 'error_file_path'

Especifica o arquivo usado para coletar linhas com erros de formatação e que não podem ser convertidas em um conjunto de linhas OLE DB. Essas linhas são copiadas do arquivo de dados para esse arquivo de erro "no estado em que se encontram".

O arquivo de erro é criado quando o comando é executado. Ocorrerá um erro se o arquivo já existir. Além disso, um arquivo de controle com a extensão .ERROR.txt é criado, que faz referência a cada linha no arquivo de erro e fornece diagnóstico de erro. Assim que os erros forem corrigidos, os dados poderão ser carregados.

Começando com o SQL Server 2017 (14.x), o error_file_path pode estar localizado no Armazenamento de Blobs do Azure.

ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name'

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores.

Especifica uma fonte de dados externa nomeada apontando para o local do Armazenamento de Blobs do Azure do arquivo de erro para acompanhar os erros encontrados durante a importação. A fonte de dados externa deve ser criada usando a opção TYPE = BLOB_STORAGE adicionada no SQL Server 2017 (14.x) CTP 1.1. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE.

PRIMEIRA LINHA = first_row

Especifica o número da primeira linha a carregar. O padrão é a primeira linha no arquivo de dados especificado. FIRSTROW é baseado em 1.

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (FIRSTROW = 2);

Observação

Substitua por <data-lake>.blob.core.windows.net uma URL apropriada.

O FIRSTROW atributo não se destina a ignorar cabeçalhos de coluna. A BULK INSERT instrução não dá suporte a ignorar cabeçalhos. Ao ignorar linhas, o Mecanismo de Banco de Dados do SQL Server examina somente os terminadores de campo e não valida os dados nos campos das linhas ignoradas.

FIRE_TRIGGERS (Disparadores_de_Fogo)

Especifica que qualquer gatilho de inserção definido na tabela de destino seja executado durante a operação de importação em massa. Se os gatilhos forem definidos para INSERT operações na tabela de destino, eles serão disparados para cada lote concluído.

Se FIRE_TRIGGERS não for especificado, nenhum gatilho de inserção será executado.

FORMATFILE_DATA_SOURCE = 'data_source_name'

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores.

Especifica uma fonte de dados externa nomeada apontando para o local do Armazenamento de Blobs do Azure do arquivo de formato para definir o esquema de dados importados. A fonte de dados externa deve ser criada usando a opção TYPE = BLOB_STORAGE adicionada no SQL Server 2017 (14.x) CTP 1.1. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE.

KEEPIDENTITY

Especifica que o valor, ou valores, de identidade no arquivo de dados importado deve ser usado para a coluna de identidade. Se KEEPIDENTITY não for especificado, os valores de identidade desta coluna serão verificados, mas não importados, e o SQL Server atribuirá automaticamente valores exclusivos com base nos valores de propagação e incremento especificados durante a criação da tabela. Se o arquivo de dados não contiver valores para a coluna de identidade na tabela ou exibição, use um arquivo de formato para especificar que a coluna de identidade na tabela ou exibição deve ser ignorada ao importar dados; o SQL Server atribui valores exclusivos para a coluna automaticamente. Para obter mais informações, confira DBCC CHECKIDENT.

Para obter mais informações, consulte como manter valores de identificação, consulte Manter valores de identidade ao importar dados em massa (SQL Server).

KEEPNULLS

Especifica que colunas vazias devem reter um valor nulo durante a operação de importação em massa, em vez de ter qualquer valor padrão para as colunas inseridas. Para obter mais informações, confira Manter valores nulos ou padrão durante a importação em massa (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batch

Especifica o número aproximado de KB (kilobytes) de dados por lote como kilobytes_per_batch. Por padrão, KILOBYTES_PER_BATCH é desconhecido. Para saber mais sobre considerações de desempenho, confira Considerações de desempenho mais adiante neste artigo.

LASTROW = last_row

Especifica o número da última linha a ser carregada. O padrão é 0, que indica a última fila no arquivo de dados especificado.

MAXERRORS = max_errors

Especifica o número máximo de erros de sintaxe permitido nos dados antes que a operação de importação em massa seja cancelada. Cada linha que não pode ser importada pela operação de importação em massa é ignorada e contada como um erro. Se max_errors não for especificado, o padrão será dez.

A opção MAX_ERRORS não se aplica a verificações de restrição ou à conversão dos tipos de dados money e bigint.

ORDER ( { coluna [ ASC | DESC ] } [ ,... n ] )

Especifica como os dados no arquivo de dados são classificados. O desempenho da importação em massa será melhorado se os dados importados forem armazenados de acordo com o índice clusterizado na tabela, se houver. Se o arquivo de dados for classificado em uma ordem diferente da ordem de uma chave de índice clusterizado ou se não houver nenhum índice clusterizado na tabela, a cláusula ORDER será ignorada. Os nomes das colunas fornecidos devem ser nomes de colunas válidas na tabela de destino. Por padrão, a operação de inserção em massa supõe que o arquivo de dados não esteja ordenado. Para obter uma importação em massa otimizada, o SQL Server também valida que os dados importados sejam classificados.

n É um espaço reservado que indica que várias colunas podem ser especificadas.

ROWS_PER_BATCH = rows_per_batch

Indica o número aproximado de linhas de dados no arquivo de dados.

Por padrão, todos os dados de arquivo são enviados ao servidor como uma única transação, e o número de linhas no lote é desconhecido para o otimizador de consulta. Se você especificar ROWS_PER_BATCH (com um valor > 0), o servidor usará esse valor para otimizar a operação de importação em massa. O valor especificado deve ROWS_PER_BATCH ser aproximadamente o mesmo que o número real de linhas. Para saber mais sobre considerações de desempenho, confira Considerações de desempenho mais adiante neste artigo.

TABLOCK

Especifica que um bloqueio no nível de tabela é adquirido durante a operação de importação em massa. Uma tabela pode ser carregada simultaneamente por vários clientes se a tabela não tiver índices e TABLOCK for especificada. Por padrão, o comportamento de bloqueio é determinado pela opção de tabela bloqueio de tabela em carregamento em massa. Manter um bloqueio durante a operação de importação em massa reduz a contenção de bloqueio na tabela e em alguns casos pode melhorar significativamente o desempenho. Para saber mais sobre considerações de desempenho, confira Considerações de desempenho mais adiante neste artigo.

Para um índice columnstore, o comportamento de bloqueio é diferente porque ele é dividido internamente em vários conjuntos de linhas. Cada thread carrega dados exclusivamente em cada conjunto de linhas, tomando um bloqueio exclusivo (X) no conjunto de linhas, permitindo a carga de dados paralela com sessões de carregamento de dados simultâneas. O uso da TABLOCK opção faz com que o thread tenha um bloqueio exclusivo na tabela (ao contrário do bloqueio de BU (atualização em massa) para conjuntos de linhas tradicionais), o que impede que outros threads simultâneos carreguem dados simultaneamente.

Opções de formato de arquivo de entrada

FORMATO = 'CSV'

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores.

especifica um arquivo de valores separados por vírgula em conformidade com o padrão RFC 4180.

BULK INSERT Sales.Orders
FROM '\\SystemX\DiskZ\Sales\data\orders.csv'
WITH (FORMAT = 'CSV');

FIELDQUOTE = 'field_quote'

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores.

Especifica um caractere a ser usado como o caractere de aspas no arquivo CSV. Se não for especificado, o caractere de aspas (") será usado como o caractere de aspas, conforme definido no padrão RFC 4180 .

FORMATFILE = 'format_file_path'

Especifica o caminho completo de um arquivo de formato. Um arquivo de formato descreve o arquivo de dados que contém as respostas armazenadas criadas usando o utilitário bcp na mesma tabela ou exibição. O arquivo de formato deverá ser usado se:

  • O arquivo de dados contiver colunas maiores ou menos colunas que a tabela ou exibição.
  • As colunas estiverem em uma ordem diferente.
  • Os delimitadores de coluna variarem.
  • Houver outras alterações no formato de dados. Os arquivos de formato em geral são criados por meio do utilitário bcp e modificados com um editor de texto conforme necessário. Para obter mais informações, consulte bcp Utility e Create a format file with bcp (SQL Server).

A partir de SQL Server 2017 (14.x) e em Banco de Dados SQL do Azure, format_file_path pode estar em Armazenamento de Blobs do Azure.

FIELDTERMINATOR = 'field_terminator'

Especifica o terminador de campo a ser usado para os arquivos de dados char e widechar. O terminador de campo padrão é \t (caractere de tabulação). Para obter mais informações, consulte Especificar terminadores de campo e linha (SQL Server).

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (FIELDTERMINATOR = ',', FIRSTROW = 2);

Observação

Substitua por <data-lake>.blob.core.windows.net uma URL apropriada.

ROWTERMINATOR = 'row_terminator'

Especifica o terminador de linha a ser usado para os arquivos de dados char e widechar. O terminador de linha padrão é \r\n(caractere de nova linha). Para obter mais informações, consulte Especificar terminadores de campo e linha (SQL Server).

Compatibilidade

BULK INSERT impõe a validação rigorosa de dados e verificações de dados de dados lidos de um arquivo que podem fazer com que os scripts existentes falhem quando são executados em dados inválidos. Por exemplo, BULK INSERT verifica se:

  • As representações nativa dos tipos de dados float ou real são válidas.
  • Dados Unicode têm um comprimento regular de byte.

Tipos de dados

Conversões do tipo de dados de cadeia de caracteres em decimal

As conversões de tipo de dados cadeia de caracteres para decimais usadas BULK INSERT seguem as mesmas regras que a função CONVERT Transact-SQL, que rejeita cadeias de caracteres que representam valores numéricos que usam notação científica. Portanto, BULK INSERT trata essas cadeias de caracteres como valores inválidos e relata erros de conversão.

Como solução alternativa para esse comportamento, use um arquivo de formato para importar em massa dados float de notação científica em uma coluna decimal. No arquivo de formato, descreva explicitamente a coluna como de dados reais ou float. Para obter mais informações sobre esses tipos de dados, consulte float e real.

Arquivos de formato representam dados real como o SQLFLT4 tipo de dados e dados float como o tipo de dados SQLFLT8. Para obter informações sobre arquivos de formato não XML, consulte Especifique o tipo de armazenamento de arquivos usando bcp (SQL Server).

Exemplo de importação de um valor numérico que usa notação científica

Este exemplo usa a seguinte tabela no banco de dados bulktest:

CREATE TABLE dbo.t_float
(
    c1 FLOAT,
    c2 DECIMAL (5, 4)
);

O usuário quer importar dados em massa para a tabela t_float. O arquivo de dados contém C:\t_float-c.datdados flutuantes de notação científica; por exemplo:

8.0000000000000002E-2 8.0000000000000002E-2

Ao copiar este exemplo, esteja ciente de diferentes editores de texto e codificações que salvam caracteres de tabulação (\t) como espaços. Um caractere de tabulação é mostrado posteriormente neste exemplo.

No entanto, BULK INSERT não é possível importar esses dados diretamente para t_float, porque sua segunda coluna, c2usa o tipo de dados decimais . Portanto, um arquivo de formato é necessário. O arquivo de formato deve mapear os dados float de notação científica para o formato decimal de coluna c2.

O arquivo de formato a seguir usa o tipo de dados SQLFLT8 para mapear o segundo campo de dados para a segunda coluna:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RECORD>
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30" />
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" />
  </RECORD>
  <ROW>
    <COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8" />
    <COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8" />
  </ROW>
</BCPFORMAT>

Para usar esse arquivo de formato (usando o nome de arquivo C:\t_floatformat-c-xml.xml) a fim de importar os dados de teste para a tabela de teste, emita a seguinte instrução Transact-SQL:

BULK INSERT bulktest.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');

Importante

O Banco de Dados SQL do Azure e o Fabric Warehouse dão suporte apenas à leitura do Armazenamento de Blobs do Azure.

Tipos de dados para exportação ou importação em massa de documentos SQLXML

Para exportar ou importar dados SQLXML em massa, use um dos tipos de dados a seguir em seu arquivo de formato:

Tipo de dados Efeito
SQLCHAR ou SQLVARCHAR Os dados são enviados na página de código do cliente ou na página de código implicada pela ordenação. O efeito é o mesmo que especificar o DATAFILETYPE = 'char' sem especificar um arquivo de formato.
SQLNCHAR ou SQLNVARCHAR Os dados são enviados como Unicode. O efeito é o mesmo que especificar o DATAFILETYPE = 'widechar' sem especificar um arquivo de formato.
SQLBINARY ou SQLVARBIN Os dados são enviados sem qualquer conversão.

Comentários

Para obter uma comparação da BULK INSERT instrução, da INSERT ... SELECT * FROM OPENROWSET(BULK...) instrução e do bcp comando, consulte Importação e Exportação de Dados em Massa (SQL Server).

Para obter informações sobre como preparar dados para importação em massa, consulte Preparar dados para exportação ou importação em massa.

A BULK INSERT instrução pode ser executada em uma transação definida pelo usuário para importar dados para uma tabela ou exibição. Opcionalmente, para usar várias correspondências para importar dados em massa, uma transação pode especificar a BATCHSIZE cláusula na BULK INSERT instrução. Se uma transação de vários lotes for revertida, todos os lotes que a transação enviada ao SQL Server serão revertidos.

Interoperabilidade

Importar dados de um arquivo CSV

A partir do SQL Server 2017 (14.x), BULK INSERT dá suporte ao formato CSV, assim como o Banco de Dados SQL do Azure.

Antes do SQL Server 2017 (14.x) CTP 1.1, arquivos CSV (Valores Separados por Vírgula) não eram compatíveis com operações de importação em massa do SQL Server. No entanto, em alguns casos, um arquivo CSV pode ser usado como o arquivo de dados para uma importação em massa de dados no SQL Server. Para obter informações sobre os requisitos para importar dados de um arquivo de dados CSV, consulte Preparar dados para exportação ou importação em massa.

Comportamento de log

Para obter informações sobre quando as operações de inserção de linha executadas pela importação em massa para o SQL Server são registradas no log de transações, consulte Pré-requisitos para o registro em log mínimo na importação em massa. Não há suporte para o log mínimo no Banco de Dados SQL do Azure.

Limitações

Ao usar um arquivo de formato com BULK INSERT, você pode especificar apenas até 1.024 campos. Isso é o mesmo que o número máximo de colunas permitido em uma tabela. Se você usar um arquivo de formato com BULK INSERT um arquivo de dados que contenha mais de 1.024 campos, BULK INSERT gerará o erro 4822. O utilitário bcp não tem essa limitação, portanto, para arquivos de dados que contêm mais de 1.024 campos, use BULK INSERT sem um arquivo de formato ou use o comando bcp .

Considerações sobre o desempenho

Se o número de páginas a ser liberado em um único lote exceder um limite interno, poderá ocorrer um exame completo do pool de buffers para identificar quais páginas devem ser liberadas quando o lote for confirmado. Esse exame completo pode prejudicar o desempenho da importação em massa. Um caso provável de exceder o limite interno ocorre quando um pool de buffers grande é combinado com um subsistema de E/S lento. Para evitar estouros de buffer em computadores grandes, não use a TABLOCK dica (que remove as otimizações em massa) ou use um tamanho de lote menor (que preserva as otimizações em massa).

É recomendável testar vários tamanhos de lote com seu carregamento de dados para descobrir o que funciona melhor para você. Tenha em mente que o tamanho do lote tem implicações parciais de reversão. Se o processo falhar e antes de usar BULK INSERT novamente, talvez seja necessário fazer um trabalho manual adicional para remover uma parte das linhas que foram inseridas com êxito, antes de ocorrer uma falha.

Com o Banco de Dados SQL do Azure, considere aumentar temporariamente o nível de desempenho do banco de dados ou da instância antes da importação se você estiver importando um grande volume de dados.

Segurança

Delegação de conta de segurança (representação)

Se um usuário usar um logon do SQL Server , o perfil de segurança da conta de processo do SQL Server será usado. Um logon que usa a autenticação do SQL Server não pode ser autenticado fora do Mecanismo de Banco de Dados. Portanto, quando um BULK INSERT comando é iniciado por um logon usando a autenticação do SQL Server, a conexão com os dados é feita usando o contexto de segurança da conta de processo do SQL Server (a conta usada pelo serviço mecanismo de banco de dados do SQL Server).

Para ler com êxito os dados de origem, você deve conceder à conta usada pelo Mecanismo de Banco de Dados do SQL Server acesso aos dados de origem. Em contrapartida, se um usuário do SQL Server efetuar logon por meio da Autenticação do Windows, o usuário pode acessar, no modo somente leitura, aqueles arquivos que podem ser acessados pela conta do usuário, a despeito do perfil de segurança do processo do SQL Server .

Ao executar a BULK INSERT instrução usando sqlcmd ou osql, de um computador, inserindo dados no SQL Server em um segundo computador e especificando um data_file no terceiro computador usando um caminho UNC, você pode receber um erro 4861.

Para resolver esse erro, use a Autenticação do SQL Server e especifique um logon do SQL Server que use o perfil de segurança da conta de processo do SQL Server, ou configure o Windows para habilitar a delegação de conta de segurança. Para obter informações sobre como habilitar uma conta de usuário que seja confiável para a delegação, consulte a Ajuda do Windows.

Para obter mais informações sobre essa e outras considerações de segurança para usar BULK INSERT, consulte Usar BULK INSERT ou OPENROWSET(BULK...) para importar dados para o SQL Server.

Ao importar do Armazenamento de Blobs do Azure e os dados não forem públicos (acesso anônimo), crie uma CREDENCIAL DATABASE SCOPED com base em uma chave SAS criptografada com uma CHAVE MESTRA e crie uma fonte de banco de dados externa para uso em seu BULK INSERT comando.

Como alternativa, crie uma DATABASE SCOPED CREDENTIAL com base em MANAGED IDENTITY para autorizar solicitações de acesso a dados em contas de armazenamento não públicas. Ao usar o MANAGED IDENTITY, o Armazenamento do Azure deve conceder permissões à identidade gerenciada da instância adicionando a função RBAC (controle de acesso baseado em função) interna do Colaborador de Blobs de Armazenamento que fornece acesso de leitura/gravação à identidade gerenciada para os contêineres de Armazenamento de Blobs do Azure necessários. A Instância Gerenciada de SQL do Azure têm uma identidade gerenciada atribuída pelo sistema e também podem ter uma ou mais identidades gerenciadas atribuídas pelo usuário. Você pode usar identidades gerenciadas atribuídas pelo sistema ou atribuídas pelo usuário para autorizar as solicitações. Para autorização, a default identidade da instância gerenciada será usada (ou seja, a identidade gerenciada atribuída pelo usuário primário ou a identidade gerenciada atribuída pelo sistema se a identidade gerenciada atribuída pelo usuário não for especificada). Para obter um exemplo, confira Como importar dados de um arquivo no Armazenamento de Blobs do Azure.

Importante

Identidade Gerenciada aplica-se ao Azure SQL, SQL Server 2025 (17.x) e versões posteriores.

Permissões

As permissões a seguir se aplicam ao local em que os dados estão sendo importados em massa (o destino).

INSERT Requer e ADMINISTER BULK OPERATIONS permissões. No Banco de Dados SQL do Azure, INSERT são ADMINISTER DATABASE BULK OPERATIONS necessárias permissões. ADMINISTER BULK OPERATIONS não há suporte para permissões ou a função bulkadmin para o SQL Server no Linux. Somente sysadmin pode executar inserções em massa para o SQL Server em Linux.

Além disso, ALTER TABLE a permissão será necessária se uma ou mais das seguintes condições forem verdadeiras:

  • As restrições existem e a opção CHECK_CONSTRAINTS não é especificada.

    Desabilitar restrições é o comportamento padrão. Para verificar as restrições explicitamente, use a opção CHECK_CONSTRAINTS .

  • Os gatilhos existem e a opção FIRE_TRIGGER não é especificada.

    Por padrão, os gatilhos não são disparados. Para disparar gatilhos explicitamente, use a opção FIRE_TRIGGER .

  • Use a opção para importar o KEEPIDENTITY valor da identidade do arquivo de dados.

Exemplos

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

Importante

O Banco de Dados SQL do Azure e o Fabric Warehouse dão suporte apenas à leitura do Armazenamento de Blobs do Azure.

a. Usar pipes para importar dados de um arquivo

O exemplo a seguir importa informações sobre detalhes de pedidos para a tabela AdventureWorks2022.Sales.SalesOrderDetail do arquivo de dados especificado usando um pipe (|) como terminador de campo e |\n como terminador de linha.

BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');

B. Usar o argumento FIRE_TRIGGERS

O exemplo a seguir especifica o argumento FIRE_TRIGGERS.

BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);

C. Usar a alimentação de linha como um terminador de linha

O exemplo a seguir importa um arquivo que usa a alimentação de linha como um terminador de linha, como uma saída UNIX:

DECLARE @bulk_cmd AS VARCHAR (1000);

SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';

EXECUTE (@bulk_cmd);

Observação

No Windows, \n é automaticamente substituído por \r\n.

D. Especifique uma página de código.

O exemplo a seguir mostra como especificar uma página de código.

BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');

E. Importar dados de um arquivo CSV

O exemplo a seguir mostra como especificar um arquivo CSV, ignorando o cabeçalho (primeira linha), usando ; como o terminador de campo e 0x0a como terminador de linha:

BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDQUOTE = '\',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0x0a'
);

O exemplo a seguir mostra como especificar um arquivo CSV no formato UTF-8 (usando um CODEPAGE de 65001), ignorando o cabeçalho (primeira linha), usando ; como o terminador de campo e 0x0a como terminador de linha:

BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
    CODEPAGE = '65001',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDQUOTE = '\',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0x0a'
);

F. Importar dados de um arquivo no Armazenamento de Blobs do Azure

O exemplo a seguir mostra como carregar dados de um arquivo CSV em um local do Armazenamento de Blobs do Azure no qual você criou uma SAS (Assinatura de Acesso Compartilhado). O local do Armazenamento de Blobs do Azure é configurado como uma fonte de dados externa, que requer uma credencial com escopo de banco de dados usando uma chave SAS criptografada usando uma chave mestra no banco de dados do usuário.

--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';
-- NOTE: Make sure that you don't have a leading ? in SAS token, and
-- that you have at least read permission on the object that should be loaded srt=o&sp=r, and
-- that expiration period is valid (all dates are in UTC time)

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/invoices',
    CREDENTIAL = MyAzureBlobStorageCredential
--> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');

O exemplo a seguir mostra como usar o BULK INSERT comando para carregar dados de um arquivo csv em um local de armazenamento de Blobs do Azure usando a Identidade Gerenciada. A localização do Armazenamento de Blobs do Azure é configurada como uma fonte de dados externa.

--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    WITH IDENTITY = 'Managed Identity';

-- NOTE: Make sure you have granted Storage Bob Data Contributor RBAC on storage to provides read/write access to the managed identity for the necessary Azure Blob Storage containers.
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/invoices',
    CREDENTIAL = MyAzureBlobStorageCredential
--> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');

Importante

Identidade Gerenciada aplica-se ao Azure SQL, SQL Server 2025 (17.x) e versões posteriores.

G. Importando dados de um arquivo no Armazenamento de Blobs do Azure e especificando um arquivo de erro

O exemplo a seguir mostra como carregar dados de um arquivo CSV em um local do Armazenamento de Blobs do Azure, configurado como uma fonte de dados externa e também especificando um arquivo de erro. Você precisa de uma credencial com escopo de banco de dados usando uma assinatura de acesso compartilhado. Se estiver em execução no Banco de Dados SQL do Azure, ERRORFILE a opção deverá ser acompanhada caso ERRORFILE_DATA_SOURCE contrário, a importação poderá falhar com o erro de permissões. O arquivo especificado no ERRORFILE contêiner não deve existir.

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
    DATA_SOURCE = 'MyAzureInvoices',
    FORMAT = 'CSV',
    ERRORFILE = 'MyErrorFile',
    ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);

Para obter exemplos completos BULK INSERT , incluindo a configuração da credencial e da fonte de dados externa, consulte Exemplos de acesso em massa a dados no Armazenamento de Blobs do Azure.

Mais exemplos

Outros exemplos de BULK INSERT são mostrados nestes artigos: