Partilhar via


Use BULK INSERT ou OPENROWSET(BULK...) para importar dados para o SQL Server

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Este artigo fornece uma visão geral de como usar a instrução Transact-SQL BULK INSERT e a INSERT...SELECT * FROM OPENROWSET(BULK...) instrução para importar dados em massa de um arquivo de dados para uma tabela do SQL Server ou do Banco de Dados SQL do Azure.

Este artigo também descreve considerações de segurança para usar BULK INSERT e OPENROWSET(BULK...)usar esses métodos para importação em massa de uma fonte de dados remota.

Declaração BULK INSERT

BULK INSERT Carrega dados de um arquivo de dados em uma tabela. Esta funcionalidade é semelhante à fornecida pela in opção do bcp comando. No entanto, o arquivo de dados é lido pelo processo do SQL Server. Para obter uma descrição da BULK INSERT sintaxe, consulte BULK INSERT (Transact-SQL).

Exemplos de BULK INSERT

Função OPENROWSET (BULK...)

O OPENROWSET provedor de conjunto de linhas em massa é acessado chamando a OPENROWSET função e especificando a BULK opção. A OPENROWSET(BULK...) função permite que você acesse dados remotos conectando-se a uma fonte de dados remota, como um arquivo de dados, por meio de um provedor de dados.

Para importar dados em massa, chame OPENROWSET(BULK...) na cláusula SELECT...FROM dentro de uma instrução INSERT.

A sintaxe básica para a importação em massa de dados é:

INSERT ... SELECT * FROM OPENROWSET(BULK...)

Quando usado numa INSERT instrução, OPENROWSET(BULK...) suporta indicações de tabela. Além das dicas de tabela regulares, como TABLOCK, a BULK cláusula pode aceitar as seguintes dicas de tabela especializada:

  • IGNORE_CONSTRAINTS (ignora apenas as restrições CHECK)
  • IGNORE_TRIGGERS
  • KEEPDEFAULTS
  • KEEPIDENTITY

Para obter mais informações, consulte Dicas de tabela (Transact-SQL).

Para obter informações sobre usos adicionais da opção BULK, consulte OPENROWSET BULK (Transact-SQL).

INSERIR... SELECT * FROM OPENROWSET(BULK...) instruções - exemplos

Considerações de segurança

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 usando 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. Por outro lado, se um usuário do SQL Server fizer logon usando a Autenticação do Windows, o usuário poderá ler somente os arquivos que podem ser acessados pela conta de usuário, independentemente do perfil de segurança do processo do SQL Server.

Por exemplo, considere um usuário que fez logon em uma instância do SQL Server usando a Autenticação do Windows. Para que o usuário possa usar BULK INSERT ou OPENROWSET para importar dados de um arquivo de dados para uma tabela do SQL Server, a conta de usuário requer acesso de leitura ao arquivo de dados. Com acesso ao arquivo de dados, o usuário pode importar dados do arquivo para uma tabela, mesmo que o processo do SQL Server não tenha permissão para acessar o arquivo. O usuário não precisa conceder permissão de acesso a arquivos para o processo do SQL Server.

O SQL Server e o Microsoft Windows podem ser configurados para permitir que uma instância do SQL Server se conecte a outra instância do SQL Server encaminhando as credenciais de um usuário autenticado do Windows. Este arranjo é conhecido como imitação ou delegação. Compreender como a versão do SQL Server lida com a segurança para a impersonação de utilizadores é importante se utilizar BULK INSERT ou OPENROWSET. A representação do usuário permite que o arquivo de dados resida em um computador diferente do processo do SQL Server ou do usuário. Por exemplo, se um usuário no Computer_A tiver acesso a um arquivo de dados no Computer_Be a delegação de credenciais tiver sido definida adequadamente, o usuário poderá se conectar a uma instância do SQL Server que esteja sendo executada em Computer_C, acessar o arquivo de dados em Computer_B, e importar dados em massa desse arquivo para uma tabela em Computer_C.

Importação em massa para o SQL Server a partir de um arquivo de dados remoto

Para usar BULK INSERT ou INSERT...SELECT * FROM OPENROWSET(BULK...) importar dados em massa de outro computador, o arquivo de dados deve ser compartilhado entre os dois computadores. Para especificar um arquivo de dados compartilhado, use seu nome UNC (convenção universal de nomenclatura), que assume a forma geral, \\Servername\Sharename\Path\Filename.

Além disso, a conta usada para acessar o arquivo de dados deve ter as permissões necessárias para ler o arquivo no disco remoto.

Por exemplo, a instrução BULK INSERT a seguir importa dados em massa para a tabela SalesOrderDetail do banco de dados AdventureWorks de um arquivo de dados chamado newdata.txt. Esse arquivo de dados reside em uma pasta compartilhada chamada \dailyorders em um diretório de compartilhamento de rede chamado salesforce em um sistema chamado computer2.

BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';

Observação

Essa restrição não se aplica ao bcp utilitário porque o cliente lê o arquivo independentemente do SQL Server.

Importação em massa do armazenamento de blobs do Azure

Ao importar do armazenamento de Blob do Azure e os dados não forem públicos (acesso anónimo), crie uma CREATE DATABASE SCOPED CREDENTIAL com base numa chave SAS criptografada com uma CREATE MASTER KEY, e depois crie uma fonte de dados externa para utilizar no seu comando BULK INSERT.

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

Importante

Não há suporte para a Identidade Gerenciada em versões do SQL Server anteriores ao SQL Server 2025.

Observação

Não utilize transação explícita, ou receberá um erro 4861.

Usar BULK INSERT

O exemplo a seguir mostra como usar o BULK INSERT comando para carregar dados de um arquivo csv em um local de armazenamento de Blob do Azure no qual você criou uma chave SAS. O local de armazenamento de Blob do Azure é configurado como uma fonte de dados externa. Isso requer uma credencial com escopo de banco de dados usando uma assinatura de acesso compartilhado 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 = 'YourStrongPassword1';
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 Blob do Azure usando a Identidade Gerenciada. O local de armazenamento de Blob do Azure é configurado 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 = 'YourStrongPassword1';
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

O Banco de Dados SQL do Azure não oferece suporte à leitura de arquivos do Windows.

Usar OPENROWSET

O exemplo a seguir mostra como usar o OPENROWSET comando para carregar dados de um arquivo csv em um local de armazenamento de Blob do Azure no qual você criou uma chave SAS. O local de armazenamento de Blob do Azure é configurado como uma fonte de dados externa. Isso requer uma credencial com escopo de banco de dados usando uma assinatura de acesso compartilhado 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 = 'YourStrongPassword1';
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!
);

INSERT INTO achievements with (TABLOCK) (id, description)
SELECT * FROM OPENROWSET(
   BULK  'csv/achievements.csv',
   DATA_SOURCE = 'MyAzureBlobStorage',
   FORMAT ='CSV',
   FORMATFILE='csv/achievements-c.xml',
   FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage'
    ) AS DataFile;

Importante

O Banco de Dados SQL do Azure não oferece suporte à leitura de arquivos do Windows.