Exemplos de acesso a dados em massa no Armazenamento de Blobs do Azure

Aplica-se a: SQL Server 2017 (14.x) e posterior Banco de Dados SQL do Azure

As instruções BULK INSERT e OPENROWSET podem acessar diretamente um arquivo no Armazenamento de Blobs do Azure. Os exemplos a seguir usam dados de um arquivo CSV (valores separados por vírgula) (denominado inv-2017-01-19.csv), armazenado em um contêiner (chamado Week3), armazenado em uma conta de armazenamento (chamada newinvoices).

Todos os caminhos para o contêiner e os arquivos no Armazenamento de Blobs diferenciam maiúsculas de minúsculas. Se não estiver correto, o sistema poderá devolver um erro como o seguinte:

Não é possível carregar em massa. O arquivo "file.csv" não existe ou você não tem direitos de acesso ao arquivo.

Criar credencial

A fonte de dados externa deve ser criada com uma credencial com escopo de banco de dados que usa a identidade SHARED ACCESS SIGNATURE. Para criar uma SAS (assinatura de acesso compartilhado) para sua conta de armazenamento, confira a propriedade Assinatura de acesso compartilhado na página de propriedades da conta de armazenamento, no portal do Azure. Para mais informações sobre assinaturas de acesso compartilhado, confira Conceder acesso limitado a recursos de Armazenamento do Azure usando assinaturas de acesso compartilhado (SAS). Para mais informações, consulte CRIAR CREDENCIAL COM ESCOPO DE BANCO DE DADOS.

Crie uma credencial com escopo de banco de dados usando o IDENTITY, que deve ser SHARED ACCESS SIGNATURE. Use o token SAS gerado para a conta de Armazenamento de Blobs. Verifique se o token SAS não tem um entrelinhamento ?, se você tem pelo menos permissão de leitura no objeto que deve ser carregado e se o período de expiração é válido (todas as datas estão em UTC).

Por exemplo:

CREATE DATABASE SCOPED CREDENTIAL UploadInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = 'sv=2018-03-28&ss=b&srt=sco&sp=rwdlac&se=2019-08-31T02:25:19Z&st=2019-07-30T18:25:19Z&spr=https&sig=KS51p%2BVnfUtLjMZtUTW1siyuyd2nlx294tL0mnmFsOk%3D';

Problemas conhecidos

Solicitações do Banco de Dados SQL do Azure e da Instância Gerenciada de SQL do Azure usando tokens SAS podem ser bloqueadas com o seguinte erro:

Msg 4861, Level 16, State 1, Line 27
Cannot bulk load because the file "FileName.extension" could not be opened. Operating system error code 5(Access is denied.).

Apenas um subconjunto de serviços do Azure está atualmente na lista de serviços confiáveis. Para obter uma lista completa de serviços confiáveis e atualizações nas configurações de firewall de armazenamento do Azure, confira Acesso confiável para recursos registrados em sua assinatura.

Exemplos

Juntamente com os exemplos neste artigo, você também pode examinar os exemplos de dados de importação do Banco de Dados SQL do Azure no GitHub.

Acessar dados em um arquivo CSV que referencia um local de Armazenamento de Blobs do Azure

O exemplo a seguir usa uma fonte de dados externa apontando para uma conta de armazenamento do Azure, denominada MyAzureInvoices.

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net',
    CREDENTIAL = UploadInvoices
);

A instrução OPENROWSET adiciona o nome do contêiner (week3) à descrição do arquivo. O arquivo é denominado inv-2017-01-19.csv.

SELECT * FROM OPENROWSET(
   BULK 'week3/inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   FORMAT = 'CSV',
   FORMATFILE = 'invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;

Usando BULK INSERT, use o contêiner e a descrição do arquivo:

BULK INSERT Colors2
FROM 'week3/inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoices', FORMAT = 'CSV');

Acessar dados em um arquivo CSV que referencia um contêiner em um local de Armazenamento de Blobs do Azure

O exemplo a seguir usa uma fonte de dados externa apontando para um contêiner (denominado week3) em uma conta de armazenamento do Azure.

CREATE EXTERNAL DATA SOURCE MyAzureInvoicesContainer
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
    CREDENTIAL = UploadInvoices
);

A instrução OPENROWSET não adiciona o nome do contêiner à descrição do arquivo:

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoicesContainer',
   FORMAT = 'CSV',
   FORMATFILE = 'invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;

Usando BULK INSERT, não use o nome do contêiner na descrição do arquivo:

BULK INSERT Colors2
FROM 'inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoicesContainer', FORMAT = 'CSV');