Dela via


Exempel på massåtkomst till data i Azure Blob Storage

gäller för: SQL Server 2017 (14.x) och senare Azure SQL DatabaseAzure SQL Managed Instance

Satserna BULK INSERT och OPENROWSET har direkt åtkomst till en fil i Azure Blob Storage. I följande exempel används data från en CSV-fil (kommaavgränsat värde) (med namnet inv-2017-01-19.csv), som lagras i en container (med namnet Week3), som lagras i ett lagringskonto (med namnet newinvoices).

Alla sökvägar till containern och till filerna på Blob Storage är skiftlägeskänsliga. Om det inte stämmer kan det returnera ett fel som i följande exempel:

Det går inte att massinläsa. Filen "file.csv" finns inte eller så har du inte filåtkomstbehörighet.

Skapa autentiseringsuppgifterna

Den externa datakällan måste skapas med en databasautentisering som använder identiteten SHARED ACCESS SIGNATURE. Information om hur du skapar en signatur för delad åtkomst (SAS) för ditt lagringskonto finns i egenskapen signatur för delad åtkomst på egenskapssidan för lagringskontot i Azure-portalen. Mer information om signaturer för delad åtkomst finns i Bevilja begränsad åtkomst till Azure Storage-resurser med hjälp av signaturer för delad åtkomst (SAS). Mer information om inloggningsuppgifter hittar du i CREATE DATABASE SCOPED CREDENTIAL.

Skapa en databasomfattande autentiseringsuppgift med IDENTITY, som måste vara SHARED ACCESS SIGNATURE. Använd SAS-token som genererats för Blob Storage-kontot. Kontrollera att din SAS-token inte har någon inledande ?, att du har minst läsbehörighet för det objekt som ska läsas in och att förfalloperioden är giltig (alla datum är i UTC-tid).

Till exempel:

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';

Kända problem

Begäranden från Azure SQL Database och Azure SQL Managed Instance med SAS-token kan blockeras med följande fel:

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.).

Endast en delmängd av Azure-tjänster finns för närvarande i listan över betrodda tjänster. En fullständig lista över betrodda tjänster och uppdateringar i Azure Storage-brandväggsinställningarna finns i Betrodd åtkomst för resurser som registrerats i din prenumeration.

Exempel

Tillsammans med exemplen i den här artikeln kan du också granska Azure SQL Database-importdataexempel på GitHub.

Komma åt data i en CSV-fil som refererar till en Azure Blob Storage-plats

I följande exempel används en extern datakälla som pekar på ett Azure Storage-konto med namnet MyAzureInvoices.

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

Sedan lägger OPENROWSET-instruktionen till containernamnet (week3) i filbeskrivningen. Filen heter 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;

Använd containern och filbeskrivningen med hjälp av BULK INSERT:

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

Komma åt data i en CSV-fil som refererar till en container på en Azure Blob Storage-plats

I följande exempel används en extern datakälla som pekar på en container (med namnet week3) i ett Azure Storage-konto.

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

Sedan innehåller OPENROWSET-instruktionen inte containernamnet i filbeskrivningen:

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

Använd BULK INSERT, men använd inte containernamnet i filbeskrivningen.

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