Compartir a través de


Ejemplos de acceso en bloque a datos de Azure Blob Storage

Se aplica a: SQL Server 2017 (14.x) y versiones posteriores Azure SQL Database Azure SQL Managed Instance

Las instrucciones BULK INSERT y OPENROWSET pueden obtener acceso directamente a un archivo de Azure Blob Storage. En los ejemplos siguientes se usan datos de un archivo CSV (valores separados por comas) (denominado inv-2017-01-19.csv), almacenado en un contenedor (denominado Week3), almacenado en una cuenta de almacenamiento (denominada newinvoices).

Todas las rutas de acceso al contenedor y a los archivos de Blob Storage distinguen mayúsculas de minúsculas. Si no es correcto, puede devolver un error como el del ejemplo siguiente:

No se puede realizar la carga masiva. El archivo "file.csv" no existe o no tienes derechos de acceso al archivo.

Crear la credencial

El origen de datos externo debe crearse con una credencial con ámbito de base de datos que use la identidad SHARED ACCESS SIGNATURE. Para crear una firma de acceso compartido (SAS) para la cuenta de almacenamiento, vea la propiedad Firma de acceso compartido en la página de propiedades de la cuenta de almacenamiento en Azure Portal. Para obtener más información sobre las firmas de acceso compartido, consulte Otorgar acceso limitado a recursos de Azure Storage con firmas de acceso compartido (SAS). Para más información sobre las credenciales, vea CREATE DATABASE SCOPED CREDENTIAL.

Cree una credencial con ámbito de base de datos con IDENTITY, que debe ser SHARED ACCESS SIGNATURE. Use el token de SAS creado para la cuenta de Blob Storage. Compruebe que el token de SAS no comience con ?, que usted tenga al menos permiso de lectura para el objeto que debe cargarse y que el período de expiración sea válido (todas las fechas están en la hora UTC).

Por ejemplo:

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 conocidos

Las solicitudes de la base de datos de Azure SQLy Azure SQL Managed Instance que utilizan tokens de SAS pueden bloquearse con el siguiente error:

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

Solo hay un subconjunto de servicios de Azure en la lista de servicios de confianza. Para obtener una lista completa de los servicios de confianza y las actualizaciones de la configuración de firewall de Azure Storage, consulte Acceso de confianza para los recursos registrados en su suscripción.

Ejemplos

Junto con los ejemplos de este artículo, también puede revisar los ejemplos de importación de datos de Azure SQL Database en GitHub.

Acceso a datos de un archivo CSV que hace referencia a una ubicación de Azure Blob Storage

En el ejemplo siguiente se usa un origen de datos externo que apunta a una cuenta de almacenamiento de Azure, denominada MyAzureInvoices.

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

Después, la instrucción agrega OPENROWSET el nombre del contenedor (week3) a la descripción del archivo. El archivo se denomina 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;

Con BULK INSERT, use el contenedor y la descripción del archivo:

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

Acceso a datos de un archivo CSV que hace referencia a un contenedor en una ubicación de Azure Blob Storage

En el ejemplo siguiente se usa un origen de datos externo que apunta a un contenedor (denominadoweek3) en cuenta de almacenamiento de Azure.

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

Después, la instrucción OPENROWSET no incluye el nombre del contenedor en la descripción del archivo:

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

Con BULK INSERT, no use el nombre del contenedor en la descripción del archivo:

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