Partilhar via


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

Aplica-se a: SQL Server 2017 (14.x) e posterior Banco de Dados SQL do AzureInstância Gerenciada 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 (valor separado por vírgula) (chamado inv-2017-01-19.csv), armazenado em um contêiner (chamado Week3), armazenado em uma conta de armazenamento (chamado newinvoices).

Todos os caminhos para o contentor e para os arquivos no Blob Storage diferenciam maiúsculas de minúsculas. Se não estiver correto, ele pode retornar um erro como o exemplo a seguir:

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

Criar a credencial

A fonte de dados externa deve ser criada com uma credencial com escopo de base de dados que utilize a identidade SHARED ACCESS SIGNATURE. Para criar uma assinatura de acesso compartilhado (SAS) para sua conta de armazenamento, consulte a propriedade Assinatura de acesso compartilhado na página de propriedades da conta de armazenamento no portal do Azure. Para obter mais informações sobre assinaturas de acesso compartilhado, consulte Conceder acesso limitado aos recursos do Armazenamento do Azure usando assinaturas de acesso compartilhado (SAS). Para obter mais informações sobre credenciais, consulte CREATE DATABASE SCOPED CREDENTIAL.

Crie uma credencial com escopo de banco de dados usando IDENTITY, que deve ser SHARED ACCESS SIGNATURE. Utilize o token SAS gerado para a conta de Armazenamento de Blobs. Verifique se o token SAS não tem um ?à esquerda, 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 no horário 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

As solicitações do Banco de Dados SQL do Azure e da Instância Gerenciada 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 sobre as configurações do firewall de armazenamento do Azure, consulte Acesso confiável para recursos registrados em sua assinatura.

Exemplos

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

Acessar dados em um arquivo CSV fazendo referência a um local de Armazenamento de Blob do Azure

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

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

Em seguida, a instrução OPENROWSET adiciona o nome do contêiner (week3) à descrição do arquivo. O arquivo é chamado 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 fazendo referência a um contêiner em um local de Armazenamento de Blob do Azure

O exemplo a seguir usa uma fonte de dados externa apontando para um contêiner (chamado 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
);

Em seguida, a instrução OPENROWSET não inclui o nome do contêiner na 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');