Beispiele für Massenzugriff auf Daten in Azure Blob Storage

Gilt für: SQL Server 2017 (14.x) und höher Azure SQL-Datenbank Azure SQL Managed Instance

Die Anweisungen BULK INSERT und OPENROWSET können direkt auf eine Datei in Azure Blob Storage zugreifen. In den folgenden Beispielen werden Daten aus einer CSV-Datei (Comma Separated Value: durch Trennzeichen getrennte Werte) (mit dem Namen inv-2017-01-19.csv) verwendet, die in einem Container (mit dem Namen Week3) gespeichert ist, der in einem Speicherkonto (mit dem Namen newinvoices) gespeichert ist.

Bei allen Pfaden zum Container und zu den Dateien in Blob Storage wird die Groß-/Kleinschreibung beachtet. Wenn die Eingabe falsch ist, kann es zu einer Fehlermeldung wie im folgenden Beispiel kommen:

Massenladen ist nicht möglich. Die Datei „file.csv“ ist nicht vorhanden, oder Sie besitzen keine Rechte für den Dateizugriff.

Anmeldeinformationen erstellen

Die externe Datenquelle muss mit für die komplette Datenbank gültige Anmeldeinformationen erstellt werden, die die SHARED ACCESS SIGNATURE-Identität verwenden. Informationen zum Erstellen einer Shared Access Signature (SAS) für das Speicherkonto finden Sie unter der Eigenschaft Shared Access Signature auf der Eigenschaftenseite des Speicherkontos im Azure-Portal. Weitere Informationen zu SAS (Shared Access Signatures) finden Sie unter Gewähren von eingeschränktem Zugriff auf Azure Storage-Ressourcen mithilfe von SAS (Shared Access Signature). Weitere Informationen finden Sie unter (Erstellen von datenbankweit gültigen Anmeldeinformationen).

Erstellen Sie datenbankweit gültige Anmeldeinformationen mithilfe von IDENTITY, die auf SHARED ACCESS SIGNATURE festgelegt sein muss. Verwenden Sie das SAS-Token, das für das Blobspeicherkonto generiert wurde. Vergewissern Sie sich, dass Ihr SAS-Token keine führende ? aufweist, dass Sie mindestens über Leseberechtigung für das Objekt verfügen, das geladen werden soll, und dass der Ablaufzeitraum gültig ist (alle Datumsangaben werden in UTC-Zeit angegeben).

Zum Beispiel:

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

Bekannte Probleme

Anforderungen von Azure SQL-Datenbank und Azure SQL Managed Instance, die SAS-Token verwenden, werden möglicherweise mit dem folgenden Fehler blockiert:

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

Nur eine Teilmenge der Azure-Dienste ist derzeit Teil der Liste der vertrauenswürdigen Dienste. Eine vollständige Liste der vertrauenswürdigen Dienste und Updates für Azure Storage Firewall-Einstellungen finden Sie unter Vertrauenswürdiger Zugriff für Ressourcen, die in Ihrem Abonnement registriert sind.

Beispiele

Zusammen mit den Beispielen in diesem Artikel können Sie auch die Beispiele für Azure SQL-Datenbankimportdaten auf GitHub lesen.

Zugriff auf Daten in einer CSV-Datei, die auf einen Speicherort von Azure Blob Storage verweisen

Im folgenden Beispiel wird eine externe Datenquelle verwendet, die auf ein Azure-Speicherkonto mit dem Namen MyAzureInvoices verweist.

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

Die OPENROWSET-Anweisung fügt den Containernamen (week3) zur Dateibeschreibung hinzu. Die Datei heißt 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;

Verwenden Sie den Container und die Dateibeschreibung mithilfe von BULK INSERT:

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

Zugriff auf Daten in einer CSV-Datei, die auf einen Container an einem Speicherort von Azure BLOB-Speicher verweisen

Im folgenden Beispiel wird eine externe Datenquelle verwendet, die auf einen Container (mit dem Namen week3) in einem Azure-Speicherkonto verweist.

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

Die OPENROWSET-Anweisung enthält den Containernamen nicht in der Dateibeschreibung:

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

Verwenden Sie den Containernamen mithilfe von BULK INSERT nicht in der Dateibeschreibung:

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