COPY INTO (Transact-SQL)

Se aplica a:Azure Synapse Analytics

En este artículo se explica cómo usar la instrucción COPY en Azure Synapse Analytics para la carga desde cuentas de almacenamiento externo. La instrucción COPY proporciona la máxima flexibilidad para la ingesta de datos de alto rendimiento en Azure Synapse Analytics.

Nota:

Para el almacenamiento de Microsoft Fabric, visite COPY INTO.

Use COPY para las siguientes funcionalidades:

  • Utilizar la carga de usuarios con menos privilegios sin necesidad de estrictos permisos de CONTROL en el almacenamiento de datos
  • Ejecución de una instrucción T-SQL única sin tener que crear objetos de base de datos adicionales
  • Analizar y cargar correctamente los archivos CSV donde los delimitadores (cadena, campo y fila) se escapan dentro de las columnas delimitadas por cadenas
  • Especificar un modelo de permisos más preciso sin exponer las claves de la cuenta de almacenamiento mediante firmas de acceso compartido (SAS)
  • Usar una cuenta de almacenamiento diferente para la ubicación de ERRORFILE (REJECTED_ROW_LOCATION)
  • Personalizar los valores predeterminados de cada columna de destino y especificar los campos de datos de origen que se van a cargar en columnas de destino concretas
  • Especificar un terminador de fila personalizado, un terminador de campo y una comilla de campo para los archivos CSV
  • Uso de los formatos de fecha de SQL Server para archivos .csv
  • Especificar caracteres comodín y varios archivos en la ruta de acceso de la ubicación de almacenamiento
  • La detección automática de esquemas simplifica el proceso de definición y asignación de los datos de origen a tablas de destino
  • El proceso de creación automática de tablas crea las tablas automáticamente y funciona junto con la detección automática de esquemas.
  • Cargue directamente tipos de datos complejos de archivos Parquet, como Mapas y Listas en columnas de cadena, sin usar otras herramientas para preprocesar los datos

Nota:

Para cargar tipos de datos complejos desde archivos Parquet, la creación automática de tablas debe activarse mediante AUTO_CREATE_TABLE.

Consulte la documentación siguiente para obtener ejemplos completos y guías de inicio rápido con la instrucción COPY:

Nota:

Microsoft Entra ID era conocido anteriormente como Azure Active Directory (Azure AD).

Sintaxis

COPY INTO [ schema. ] table_name
[ (Column_list) ]
FROM '<external_location>' [ , ...n ]
WITH
 (
 [ FILE_TYPE = { 'CSV' | 'PARQUET' | 'ORC' } ]
 [ , FILE_FORMAT = EXTERNAL FILE FORMAT OBJECT ]
 [ , CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , ERRORFILE = ' [ http(s)://storageaccount/container ] /errorfile_directory [ / ] ] '
 [ , ERRORFILE_CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , MAXERRORS = max_errors ]
 [ , COMPRESSION = { 'Gzip' | 'DefaultCodec' | 'Snappy' } ]
 [ , FIELDQUOTE = 'string_delimiter' ]
 [ , FIELDTERMINATOR =  'field_terminator' ]
 [ , ROWTERMINATOR = 'row_terminator' ]
 [ , FIRSTROW = first_row ]
 [ , DATEFORMAT = 'date_format' ]
 [ , ENCODING = { 'UTF8' | 'UTF16' } ]
 [ , IDENTITY_INSERT = { 'ON' | 'OFF' } ]
 [ , AUTO_CREATE_TABLE = { 'ON' | 'OFF' } ]
)

Argumentos

schema_name

Es opcional si el esquema predeterminado para el usuario que realiza la operación es el esquema de la tabla especificada. Si no se especifica el esquema y el esquema predeterminado del usuario que realiza la operación COPY es diferente del esquema de la tabla especificada, se cancela COPY y se devuelve un mensaje de error.

table_name

Es el nombre de la tabla en la que se van a copiar (COPY) los datos. La tabla de destino puede ser una tabla temporal o permanente, y ya debe existir en la base de datos. Para el modo de detección automática de esquemas, no proporcione una lista de columnas.

(column_list)

Lista opcional de una o varias columnas que se usa para asignar campos de datos de origen a las columnas de la tabla de destino y cargar datos.

No especifique una column_list cuando AUTO_CREATE_TABLE = 'ON'.

column_list debe ir entre paréntesis y delimitada con comas. La lista de columnas tiene el formato siguiente:

[(Column_name [default Default_value] [Field_number] [,...n])]

  • Column_name: el nombre de la columna en la tabla de destino.
  • Default_value: valor predeterminado que sustituye a cualquier valor NULL del archivo de entrada. El valor predeterminado se aplica a todos los formatos de archivo. COPY intenta cargar NULL desde el archivo de entrada cuando se omite una columna de la lista de columnas o cuando hay un campo de archivo de entrada vacío. El valor predeterminado va precedido de la palabra clave "default".
  • Field_number: número de campo de archivo de entrada asignado a la columna de destino.
  • La indización de campos comienza en 1.

Cuando no se especifica una lista de columnas, COPY asigna columnas en función de la posición ordinal de origen y de destino: El campo de entrada 1 va a la columna de destino 1, el campo 2 va a la columna 2, etc.

Ubicaciones externas

Es donde se almacenan provisionalmente los archivos que contienen los datos. Actualmente se admiten Azure Data Lake Storage (ADLS) Gen2 y Azure Blob Storage:

  • Ubicación externa para Blob Storage: https://<account\>.blob.core.windows.net/<container\>/<path\>
  • Ubicación externa para ADLS Gen2: https://<account\>.dfs.core.windows.net/<container\>/<path\>

Nota

El punto de conexión .blob también está disponible para ADLS Gen2 y actualmente ofrece el mejor rendimiento. Use el punto de conexión .blob cuando no se requiera .dfs para su método de autenticación.

  • Cuenta: el nombre de la cuenta de almacenamiento

  • Contenedor: el nombre del contenedor de blobs

  • Ruta: la carpeta o la ruta de acceso de archivo para los datos. La ubicación comienza en el contenedor. Si se especifica una carpeta, COPY recupera todos los archivos de la carpeta y todas sus subcarpetas. COPY omite las carpetas ocultas y no devuelve los archivos que comienzan por un carácter de subrayado (_) o un punto (.), a menos que se especifique explícitamente en la ruta de acceso. Este comportamiento es el mismo incluso cuando se especifica una ruta de acceso con un carácter comodín.

Se pueden incluir caracteres comodín en la ruta de acceso, donde

  • La coincidencia de nombres de la ruta de acceso de caracteres comodín distingue mayúsculas de minúsculas
  • El carácter comodín se puede escapar mediante el carácter de barra diagonal inversa (\)
  • La expansión de caracteres comodín se aplica de forma recursiva. Por ejemplo, todos los archivos CSV de Customer1 (incluidos los subdirectorios de Customer1 se cargan en el ejemplo siguiente: Account/Container/Customer1/*.csv

Nota

Para obtener el mejor rendimiento, evite especificar caracteres comodín que se expandan en un número elevado de archivos. Si es posible, enumere varias ubicaciones de archivo en lugar de especificar caracteres comodín.

Solo se pueden especificar varias ubicaciones de archivos desde el mismo contenedor y cuenta de almacenamiento a través de una lista separada por comas, por ejemplo:

  • https://<account>.blob.core.windows.net/<container\>/<path\>, https://<account\>.blob.core.windows.net/<container\>/<path\>

FILE_TYPE = { 'CSV' | 'PARQUET' | 'ORC' }

FILE_TYPE especifica el formato de los datos externos.

  • CSV: Especifica un archivo de valores separados por comas conforme a la norma RFC 4180.
  • PARQUET: Especifica un formato Parquet.
  • ORC: Especifica un formato ORC (Optimized Row Columnar).

Nota

El tipo de archivo de “texto delimitado” en PolyBase se reemplaza por el formato de archivo “CSV” cuando el delimitador predeterminado de coma se puede configurar mediante el parámetro FIELDTERMINATOR.

FILE_FORMAT = external_file_format_name

FILE_FORMAT se aplica solo a archivos Parquet y ORC y especifica nombre del objeto de formato de archivo externo que almacena el tipo de archivo y el método de compresión de los datos externos. Para crear un formato de archivo externo, use CREATE EXTERNAL FILE FORMAT.

CREDENTIAL (IDENTITY = '', SECRET = '')

CREDENTIAL especifica el mecanismo de autenticación para tener acceso a la cuenta de almacenamiento externa. Los métodos de autenticación son:

CSV Parquet ORC
Azure Blob Storage SAS/MSI/SERVICE PRINCIPAL/KEY/AAD SAS/KEY SAS/KEY
Azure Data Lake Gen2 SAS/MSI/SERVICE PRINCIPAL/KEY/AAD SAS (blob 1 )/MSI (dfs 2 )/SERVICE PRINCIPAL/KEY/AAD SAS (blob 1 )/MSI (dfs 2 )/SERVICE PRINCIPAL/KEY/AAD

1: Para este método de autenticación, se requiere el punto de conexión .blob ( .blob.core.windows.net) en la ruta de acceso a la ubicación externa.

2: Para este método de autenticación, se requiere el punto de conexión .dfs ( .dfs.core.windows.net) en la ruta de acceso a la ubicación externa.

Nota:

  • Al autenticarse mediante microsoft Entra ID o en una cuenta de almacenamiento pública, no es necesario especificar CREDENTIAL.
  • Si la cuenta de almacenamiento está asociada a una red virtual, debe autenticarse mediante una identidad administrada.
  • Autenticación con firmas de acceso compartido (SAS)

    • IDENTITY: constante con un valor de “firma de acceso compartido”
    • SECRET: Lafirma de acceso compartido proporciona acceso delegado a los recursos de la cuenta de almacenamiento.
    • Permisos mínimos necesarios: READ y LIST
  • Autenticación con entidades de servicio

    • IDENTITY: <ClientID>@<OAuth_2.0_Token_EndPoint>
    • SECRETO: Clave de entidad de servicio de la aplicación Microsoft Entra
    • Roles de RBAC mínimos necesarios: Colaborador de datos de Storage Blob, colaborador de datos de Storage Blob, propietario de datos de Storage Blob o lector de datos de Storage Blob
  • Autenticación con la clave de la cuenta de almacenamiento

    • IDENTITY: constante con un valor de “clave de cuenta de almacenamiento”
    • SECRET: Clave de cuenta de almacenamiento
  • Autenticación con identidad administrada (puntos de conexión de servicio de red virtual)

    • IDENTITY: constante con un valor de “identidad administrada”
    • Roles de RBAC mínimos necesarios: colaborador de datos de blobs de almacenamiento o propietario de datos de blobs de Storage para el servidor lógico registrado de Microsoft Entra en Azure. Cuando se usa un grupo de SQL dedicado (anteriormente SQL DW) que no está asociado a un área de trabajo de Synapse, este rol de RBAC no es necesario, pero la identidad administrada requiere permisos de lista de control de acceso (ACL) en los objetos de destino para habilitar el acceso de lectura a los archivos de origen.
  • Autenticación con un usuario de Microsoft Entra

    • No se requiere CREDENCIAL
    • Roles de RBAC mínimos necesarios: colaborador de datos de blobs de almacenamiento o propietario de datos de blobs de Storage para el usuario de Microsoft Entra

ERRORFILE = Ubicación del directorio

ERRORFILE solo se aplica a CSV. Especifica el directorio de la instrucción COPY donde se deben escribir las filas rechazadas y el archivo de error correspondiente. Se puede especificar la ruta de acceso completa de la cuenta de almacenamiento o se puede especificar la ruta de acceso relativa al contenedor. Si la ruta de acceso especificada no existe, se crea una en su nombre. Se crea un directorio secundario con el nombre «_rejectedrows». El carácter «_» garantiza que se escape el directorio para otro procesamiento de datos a menos que se mencione explícitamente en el parámetro de ubicación.

Nota:

Cuando se pasa una ruta de acceso relativa a ERRORFILE, la ruta de acceso es relativa a la ruta de acceso del contenedor especificada en external_location.

En este directorio hay una carpeta que se crea según la hora de envío de la carga con el formato AñoMesDía-HoraMinutoSegundo (por ejemplo, 20180330-173205). En esta carpeta, se escriben dos tipos de archivos, el archivo de motivos (error) y el archivo de datos (fila) cada uno anexado previamente con queryID, distributionID y GUID de archivo. Como los datos y los motivos están en archivos independientes, los archivos correspondientes tienen un prefijo coincidente.

Si ERRORFILE tiene la ruta de acceso completa de la cuenta de almacenamiento definida, ERRORFILE_CREDENTIAL se usa para conectarse al almacenamiento. De lo contrario, se usa el valor mencionado para CREDENTIAL. Cuando se usa la misma credencial que se usa para los datos de origen para ERRORFILE, también se aplican restricciones que se aplican a ERRORFILE_CREDENTIAL también se aplican

ERRORFILE_CREDENTIAL = (IDENTITY= '', SECRET = '')

ERRORFILE_CREDENTIAL solo se aplica a los archivos CSV. Los métodos de autenticación y el origen de datos admitidos son:

  • Azure Blob Storage: SAS/SERVICE PRINCIPAL/AAD

  • Azure Data Lake Gen2: SAS/MSI/SERVICE PRINCIPAL/AAD

  • Autenticación con firmas de acceso compartido (SAS)

    • IDENTITY: constante con un valor de “firma de acceso compartido”
    • SECRET: Lafirma de acceso compartido proporciona acceso delegado a los recursos de la cuenta de almacenamiento.
    • Permisos mínimos necesarios: READ, LIST, WRITE, CREATE, DELETE
  • Autenticación con entidades de servicio

    • IDENTITY: <ClientID>@<OAuth_2.0_Token_EndPoint>
    • SECRETO: Clave de entidad de servicio de la aplicación Microsoft Entra
    • Roles de RBAC mínimos necesarios: Colaborador de datos de Storage Blob o propietario de datos de Storage Blob

Nota

Usar el punto de conexión de token de OAuth 2.0 V1

  • Autenticación con identidad administrada (puntos de conexión de servicio de red virtual)

    • IDENTITY: constante con un valor de “identidad administrada”
    • Roles de RBAC mínimos necesarios: colaborador de datos de blobs de almacenamiento o propietario de datos de blobs de Storage para el servidor de SQL Database registrado de Microsoft Entra
  • Autenticación con un usuario de Microsoft Entra

    • No se requiere CREDENCIAL
    • Roles de RBAC mínimos necesarios: colaborador de datos de blobs de almacenamiento o propietario de datos de blobs de Storage para el usuario de Microsoft Entra

No se admite el uso de una clave de cuenta de almacenamiento con ERRORFILE_CREDENTIAL.

Nota:

Si usa la misma cuenta de almacenamiento para ERRORFILE y especifica la ruta de acceso de ERRORFILE relativa a la raíz del contenedor, no es necesario especificar ERROR_CREDENTIAL.

MAXERRORS = max_errors

MAXERRORS especifica el número máximo de filas de rechazo permitidas en la carga antes de que se produzca un error en la operación COPY. Cada fila que no se puede importar con la operación COPY se omite y se cuenta como un error. Si no se especifica max_errors, el valor predeterminado es 0.

MAXERRORS no se puede usar con AUTO_CREATE_TABLE.

Cuando FILE_TYPE es "PARQUET", las excepciones causadas por errores de conversión de tipos de datos (por ejemplo, binario parquet a entero de SQL) seguirán provocando un error en COPY INTO, omindo MAXERRORS.

COMPRESSION = { 'DefaultCodec ' | 'Snappy' | 'GZIP' | 'NONE'}

COMPRESSION es opcional y especifica el método de compresión de datos para los datos externos.

  • CSV admite GZIP
  • Parquet admite GZIP y Snappy
  • ORC admite DefaultCodec y Snappy.
  • Zlib es la compresión predeterminada para ORC

El comando COPY detecta automáticamente el tipo de compresión según la extensión del archivo si no se especifica este parámetro:

  • .gz - GZIP
  • .snappy – Snappy
  • .deflate - DefaultCodec (solo Parquet y ORC)

FIELDQUOTE = 'field_quote'

FIELDQUOTE se aplica a CSV y especifica un solo carácter que se usa como carácter de comilla (delimitador de cadena) en el archivo CSV. Si no se especifica, se usa el carácter de comillas (") como carácter de comillas, según define la norma RFC 4180. También se admite la notación hexadecimal para FIELDQUOTE. Los caracteres ASCII y multi byte extendidos no se admiten con UTF-8 para FIELDQUOTE.

Nota:

Los caracteres FIELDQUOTE se escapan en columnas de cadena en las que existe la presencia de un doble FIELDQUOTE (delimitador).

FIELDTERMINATOR = 'field_terminator'

FIELDTERMINATOR solo se aplica a CSV. Especifica el terminador de campo que se usa en el archivo CSV. El terminador de campo se puede especificar mediante notación hexadecimal. El terminador de campo puede ser de varios caracteres. El terminador de campo predeterminado es una coma (,). Los caracteres ASCII y multi byte extendidos no se admiten con UTF-8 para FIELDTERMINATOR.

ROW TERMINATOR = 'row_terminator'

ROW TERMINATOR solo se aplica a CSV. Especifica el terminador de fila que se usa en el archivo CSV. El terminador de fila se puede especificar mediante notación hexadecimal. El terminador de fila puede ser de varios caracteres. De forma predeterminada, el terminador de fila es \r\n.

El comando COPY antepone el carácter \r al especificar \n (nueva línea), lo que genera \r\n. Para especificar solo el carácter \n, use la notación hexadecimal (0x0A). Al especificar los terminadores de fila de varios caracteres en formato hexadecimal, no especifique 0x entre cada carácter.

Los caracteres ASCII y multi byte extendidos no se admiten con UTF-8 para ROW TERMINATOR.

FIRSTROW = First_row_int

FIRSTROW se aplica a CSV y especifica el número de fila que se lee primero en todos los archivos para el comando COPY. Los valores se inician a partir de 1, que es el valor predeterminado. Si el valor se establece en dos, se omite la primera fila de cada archivo (fila de encabezado) al cargar los datos. Las filas se omiten en función de la existencia de terminadores de fila.

DATEFORMAT = { 'mdy' | 'dmy' | 'ymd' | 'ydm' | 'myd' | 'dym' }

DATEFORMAT solo se aplica a CSV y especifica el formato de fecha de la asignación de fecha para los formatos de fecha de SQL Server. Para una introducción acerca de todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea Funciones de fecha y hora (Transact-SQL). DATEFORMAT dentro del comando COPY tiene prioridad sobre DATEFORMAT configurado en el nivel de sesión.

ENCODING = 'UTF8' | 'UTF16'

ENCODING solo se aplica a CSV. El valor predeterminado es UTF8. Especifica el estándar de codificación de datos para los archivos cargados por el comando COPY.

IDENTITY_INSERT = 'ON' | 'OFF'

IDENTITY_INSERT especifica si el valor o los valores de identidad del archivo de datos importado se van a utilizar para la columna de identidad. Si IDENTITY_INSERT está desactivado (OFF, valor predeterminado), se comprueban los valores de identidad de esta columna, pero no se importan. Azure Synapse Analytics asigna automáticamente valores únicos en función de los valores de inicialización e incremento especificados durante la creación de la tabla. Tenga en cuenta el siguiente comportamiento con el comando COPY:

  • Si IDENTITY_INSERT es OFF y la tabla tiene una columna de identidad
    • Se debe especificar una lista de columnas que no asigne un campo de entrada a la columna de identidad.
  • Si IDENTITY_INSERT está activado y la tabla tiene una columna de identidad
    • Si se pasa una lista de columnas, debe asignar un campo de entrada a la columna de identidad.
  • No se admite el valor predeterminado para IDENTITY COLUMN en la lista de columnas.
  • IDENTITY_INSERT solo se puede establecer para una tabla cada vez.

AUTO_CREATE_TABLE = { 'ON' | 'OFF' }

AUTO_CREATE_TABLE especifica si la tabla se podría crear automáticamente trabajando junto con la detección automática de esquemas. Solo está disponible para archivos de Parquet.

  • ON: habilita la creación automática de tablas. El proceso COPY INTO crea automáticamente una nueva tabla detectando la estructura del archivo que se va a cargar. También se puede usar con tablas preexistentes para aprovechar la detección automática de esquemas de archivos de Parquet.
  • OFF: la creación automática de tablas no está habilitada. Predeterminada.

Nota

La creación automática de tablas funciona junto con la detección automática de esquemas. La creación automática de tablas NO está habilitada de forma predeterminada.

No lo cargue en tablas distribuidas por hash desde archivos de Parquet mediante COPY INTO con AUTO_CREATE_TABLE = "ON".

Si los archivos de Parquet se van a cargar en tablas distribuidas por hash mediante COPY INTO, cárguelo en una tabla de almacenamiento provisional round robin seguida de INSERT ... SELECT de esa tabla a la tabla distribuida por hash de destino.

Permisos

El usuario que ejecuta el comando COPY debe tener los permisos siguientes:

Se requieren los permisos INSERT y ADMINISTER BULK OPERATIONS. En Azure Synapse Analytics, se necesitan los permisos INSERT y ADMINISTER DATABASE BULK OPERATIONS.

Además, si el usuario que ejecuta el comando COPY también pretende generar una nueva tabla y cargar datos en ella, necesitará los permisos CREATE TABLE y ALTER ON SCHEMA.

Por ejemplo, para permitir que mike@contoso.com use COPY para crear una nueva tabla en el esquema HR e insertar los datos de un archivo Parquet, use el siguiente ejemplo de Transact-SQL:

GRANT ADMINISTER DATABASE BULK OPERATIONS to [mike@contoso.com];
GRANT INSERT to [mike@contoso.com];

GRANT CREATE TABLE to [mike@contoso.com];
GRANT ALTER on SCHEMA::HR to [mike@contoso.com];

Comentarios

La instrucción COPY solo acepta caracteres válidos UTF-8 y UTF-16 para los parámetros de comando y datos de fila. Los archivos o parámetros de origen (como ROW TERMINATOR o FIELD TERMINATOR) que usan caracteres no válidos pueden interpretarse incorrectamente por la instrucción COPY y provocar resultados inesperados como daños en los datos u otros errores. Asegúrese de que los archivos de origen y los parámetros son compatibles con UTF-8 o UTF-16 antes de invocar la instrucción COPY.

Ejemplos

A. Realizar la carga desde una cuenta de almacenamiento público

El ejemplo siguiente es la forma más sencilla del comando COPY, que carga datos desde una cuenta de almacenamiento pública. En este ejemplo, los valores predeterminados de la instrucción COPY coinciden con el formato del archivo CSV del elemento de línea.

COPY INTO dbo.[lineitem]
FROM 'https://unsecureaccount.blob.core.windows.net/customerdatasets/folder1/lineitem.csv'
WITH (FIELDTERMINATOR = '|')

Los valores predeterminados del comando COPY son:

  • DATEFORMAT = DATEFORMAT de la sesión

  • MAXERRORS = 0

  • COMPRESSION = descomprimido

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Importante

Internamente, COPY trata \n como si fuera \r\n. Para más información, vea la sección ROWTERMINATOR.

  • FIRSTROW = 1

  • ENCODING = 'UTF8'

  • FILE_TYPE = 'CSV'

  • IDENTITY_INSERT = 'OFF'

B. Realizar la carga mediante la autenticación a través de la firma de acceso compartido (SAS)

En el ejemplo siguiente se cargan archivos que usan el avance de línea como terminador de fila, como una salida de UNIX. En este ejemplo también se usa una clave SAS para autenticarse en Azure Blob Storage.

COPY INTO test_1
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='?sv=2018-03-28&ss=bfqt&srt=sco&sp=rl&st=2016-10-17T20%3A14%3A55Z&se=2021-10-18T20%3A19%3A00Z&sig=IEoOdmeYnE9%2FKiJDSHFSYsz4AkNa%2F%2BTx61FuQ%2FfKHefqoBE%3D'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=';',
    ROWTERMINATOR='0X0A',
    ENCODING = 'UTF8',
    DATEFORMAT = 'ymd',
    MAXERRORS = 10,
    ERRORFILE = '/errorsfolder',--path starting from the storage container
    IDENTITY_INSERT = 'ON'
)

C. Realizar la carga con una lista de columnas con valores predeterminados mediante la autenticación a través de la clave de cuenta de almacenamiento

En este ejemplo se cargan archivos que especifican una lista de columnas con valores predeterminados.

--Note when specifying the column list, input field numbers start from 1
COPY INTO test_1 (Col_one default 'myStringDefault' 1, Col_two default 1 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='<Your_Account_Key>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='x6RWv4It5F2msnjelv3H4DA80n0PQW0daPdw43jM0nyetx4c6CpDkdj3986DX5AHFMIf/YN4y6kkCnU8lb+Wx0Pj+6MDw=='),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='0x0A',
    ENCODING = 'UTF8',
    FIRSTROW = 2
)

D. Realizar la carga de ORC o Parquet con el objeto de formato de archivo existente

En este ejemplo se usa un carácter comodín para cargar todos los archivos de Parquet en una carpeta.

COPY INTO test_parquet
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
WITH (
    FILE_FORMAT = myFileFormat,
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>')
)

E. Realizar la carga mediante la especificación de caracteres comodín y varios archivos

COPY INTO t1
FROM
'https://myaccount.blob.core.windows.net/myblobcontainer/folder0/*.txt',
    'https://myaccount.blob.core.windows.net/myblobcontainer/folder1'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= '<client_id>@<OAuth_2.0_Token_EndPoint>',SECRET='<key>'),
    FIELDTERMINATOR = '|'
)

F. Realizar la carga con credenciales de MSI

COPY INTO dbo.myCOPYDemoTable
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder0/*.txt'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL = (IDENTITY = 'Managed Identity'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=','
)

G. Realizar la carga con la detección automática de esquemas

COPY INTO [myCOPYDemoTable]
FROM 'https://myaccount.blob.core.windows.net/customerdatasets/folder1/lineitem.parquet'
WITH (
    FILE_TYPE = 'Parquet',
    CREDENTIAL = ( IDENTITY = 'Shared Access Signature',  SECRET='<key>'),
    AUTO_CREATE_TABLE = 'ON'
)

Preguntas más frecuentes

¿Cuál es el rendimiento del comando COPY en comparación con PolyBase?

El comando COPY tiene un mejor rendimiento en función de la carga de trabajo.

  • Los archivos comprimidos no se pueden dividir automáticamente. Para obtener el mejor rendimiento, considere la posibilidad de dividir la entrada en varios archivos al cargar archivos .csv comprimidos.

  • Los archivos .csv grandes sin comprimir se pueden dividir y cargar en paralelo automáticamente, por lo que no es necesario dividir manualmente archivos .csv sin comprimir en la mayoría de los casos. En determinados casos en los que la división automática de archivos no es factible debido a las características de los datos, la división manual de archivos .csv de gran tamaño puede seguir favoreciendo el rendimiento.

¿Cuál es el procedimiento para dividir archivos a la hora de cargar archivos .csv comprimidos con el comando COPY?

Las instrucciones sobre el número de archivos se describen en la tabla siguiente. Una vez alcanzado el número recomendado de archivos, obtendrá un mejor rendimiento cuanto mayor tamaño tengan estos. El número de archivos viene determinado por el número de nodos de proceso multiplicado por 60. Por ejemplo, en 6000DWU hay 12 nodos de proceso y 12*60 = 720 particiones. Para obtener una experiencia sencilla de división de archivos, consulte Procedimiento para maximizar el rendimiento de carga de COPY con divisiones de archivos.

DWU Número de archivos
100 60
200 60
300 60
400 60
500 60
1,000 120
1500 180
2\.000 240
2,500 300
3,000 360
5\.000 600
6,000 720
7 500 900
10 000 1200
15,000 1800
30,000 3600

¿Cuál es el procedimiento para dividir archivos a la hora de cargar archivos ORC o Parquet con el comando COPY?

No es necesario dividir los archivos ORC o Parquet porque el comando COPY lo hace de forma automática. Para obtener el mejor rendimiento, los archivos Parquet y ORC de la cuenta de almacenamiento de Azure deben tener un tamaño de 256 MB o más.

¿Hay alguna limitación en el número o el tamaño de los archivos?

No hay limitaciones en cuanto al número o tamaño de los archivos. Sin embargo, para obtener el mejor rendimiento, se recomienda usar archivos que tengan al menos 4 MB.

¿Hay algún problema conocido con la instrucción COPY?

Si tiene un área de trabajo de Azure Synapse que ha creado antes del 7 de diciembre de 2020, es posible que aparezca un mensaje de error similar al autenticarse con una identidad administrada: com.microsoft.sqlserver.jdbc.SQLServerException: Managed Service Identity has not been enabled on this server. Please enable Managed Service Identity and try again.

Siga estos pasos para solucionar este problema volviendo a registrar la identidad administrada del área de trabajo:

  1. Instale Azure PowerShell. Consulte Instalación de PowerShell.
  2. Registre la identidad administrada del área de trabajo mediante PowerShell:
    Connect-AzAccount
    Select-AzSubscription -SubscriptionId <subscriptionId>
    Set-AzSqlServer -ResourceGroupName your-database-server-resourceGroup -ServerName your-SQL-servername -AssignIdentity
    

Pasos siguientes

Información general sobre la carga con Azure Synapse Analytics

Se aplica a:Almacenamiento de Microsoft Fabric

En este artículo se explica cómo usar la instrucción COPY en el almacén de Microsoft Fabric para la carga desde cuentas de almacenamiento externo. La instrucción COPY proporciona la mayor flexibilidad para la ingesta de datos de alto rendimiento en el almacenamiento y es una estrategia para ingerir datos en el almacén.

En Microsoft Fabric, la instrucción COPY (Transact-SQL) admite actualmente los formatos de archivo PARQUET y CSV. En el caso de los orígenes de datos, solo se admiten cuentas de Azure Data Lake Storage Gen2.

Para más información sobre el uso de COPY INTO en el almacén de Microsoft Fabric, consulte Ingesta de datos en el almacén mediante la instrucción COPY.

Nota:

Para Azure Synapse Analytics, visite COPY INTO para Azure Synapse Analytics.

Use COPY para las siguientes funcionalidades:

  • Use los usuarios con menos privilegios para realizar la carga sin necesidad de estrictos permisos de CONTROL en el almacenamiento de datos.
  • Ejecute una instrucción T-SQL única sin tener que crear objetos de base de datos adicionales.
  • Analice y cargue correctamente los archivos CSV donde los delimitadores (cadena, campo y fila) se escapan dentro de las columnas delimitadas por cadenas.
  • Especifique un modelo de permisos más preciso sin exponer las claves de la cuenta de almacenamiento mediante firmas de acceso compartido (SAS).
  • Use una cuenta de almacenamiento diferente para la ubicación de ERRORFILE (REJECTED_ROW_LOCATION).
  • Personalice los valores predeterminados de cada columna de destino y especifique los campos de datos de origen que se van a cargar en columnas de destino concretas.
  • Especificar un terminador de fila personalizado, un terminador de campo y una comilla de campo para los archivos CSV
  • Especifique caracteres comodín y varios archivos en la ruta de acceso de la ubicación de almacenamiento.
  • Para más información sobre las opciones de ingesta de datos y los procedimientos recomendados, consulte Ingesta de datos en el almacenamiento mediante la instrucción COPY.

Sintaxis

COPY INTO [ warehouse_name. ] [ schema_name. ] table_name
[ (Column_list) ]
FROM '<external_location>' [ , ...n ]
WITH
 (
 [ FILE_TYPE = { 'CSV' | 'PARQUET' } ]
 [ , CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , ERRORFILE = ' [ http(s)://storageaccount/container ] /errorfile_directory [ / ] ] '
 [ , ERRORFILE_CREDENTIAL = (AZURE CREDENTIAL) ]
 [ , MAXERRORS = max_errors ]
 [ , COMPRESSION = { 'Gzip' | 'Snappy' } ]
 [ , FIELDQUOTE = 'string_delimiter' ]
 [ , FIELDTERMINATOR =  'field_terminator' ]
 [ , ROWTERMINATOR = 'row_terminator' ]
 [ , FIRSTROW = first_row ]
 [ , ENCODING = { 'UTF8' | 'UTF16' } ]
 [ , PARSER_VERSION = { '1.0' | '2.0' } ]
)

Argumentos

warehouse_name

Es opcional si el almacén actual del usuario que realiza la operación es el almacén de la tabla especificada. Si no se especifica el almacenamiento y el esquema y la tabla especificados no existen en el almacén actual, se produce un error en COPY y se devuelve un mensaje de error.

schema_name

Es opcional si el esquema predeterminado para el usuario que realiza la operación es el esquema de la tabla especificada. Si no se especifica el esquema y el esquema predeterminado del usuario que realiza la operación COPY es diferente del esquema de la tabla especificada, se cancela COPY y se devuelve un mensaje de error.

table_name

Es el nombre de la tabla en la que se van a copiar (COPY) los datos. La tabla de destino ya debe existir en el almacén.

(column_list)

Lista opcional de una o varias columnas que se usa para asignar campos de datos de origen a las columnas de la tabla de destino y cargar datos.

column_list debe ir entre paréntesis y delimitada con comas. La lista de columnas tiene el formato siguiente:

[(Column_name [default Default_value] [Field_number] [,...n])]

  • Column_name: el nombre de la columna en la tabla de destino.
  • Default_value: valor predeterminado que sustituye a cualquier valor NULL del archivo de entrada. El valor predeterminado se aplica a todos los formatos de archivo. COPY intenta cargar NULL desde el archivo de entrada cuando se omite una columna de la lista de columnas o cuando hay un campo de archivo de entrada vacío. El valor predeterminado va precedido de la palabra clave "default".
  • Field_number: número de campo de archivo de entrada asignado a la columna de destino.
  • La indización de campos comienza en 1.

Cuando no se especifica column_list, COPY asigna columnas en función de la posición ordinal de origen y de destino: El campo de entrada 1 va a la columna de destino 1, el campo 2 va a la columna 2, etc.

Nota:

Cuando se trabaja con archivos de Parquet en la características Almacén de Microsoft Fabric, los nombres de columna deben coincidir exactamente en el origen y el destino. Si el nombre de la columna de la tabla de destino es diferente al del nombre de la columna en el archivo Parquet, la columna de la tabla de destino se rellena con NULL.

Cuando no se especifica una lista de columnas, COPY asigna columnas en función de la posición ordinal de origen y de destino: El campo de entrada 1 va a la columna de destino 1, el campo 2 va a la columna 2, etc.

Ubicaciones externas

Especifica el lugar donde se almacenan provisionalmente los archivos que contienen los datos. Actualmente se admiten Azure Data Lake Storage (ADLS) Gen2 y Azure Blob Storage:

  • Ubicación externa para Blob Storage: https://<account\>.blob.core.windows.net/<container\>/<path\>
  • Ubicación externa para ADLS Gen2: https://<account\>.dfs.core.windows.net/<container\>/<path\>

Azure Data Lake Storage (ADLS) Gen2 ofrece un mejor rendimiento que Azure Blob Storage (heredado). Considere la posibilidad de usar una cuenta de ADLS Gen2 siempre que sea posible.

Nota

El punto de conexión .blob también está disponible para ADLS Gen2 y actualmente ofrece el mejor rendimiento. Use el punto de conexión .blob cuando no se requiera .dfs para su método de autenticación.

  • Cuenta: el nombre de la cuenta de almacenamiento

  • Contenedor: el nombre del contenedor de blobs

  • Ruta: la carpeta o la ruta de acceso de archivo para los datos. La ubicación comienza en el contenedor. Si se especifica una carpeta, COPY recupera todos los archivos de la carpeta y todas sus subcarpetas. COPY omite las carpetas ocultas y no devuelve los archivos que comienzan por un subrayado (_) o un punto (.), a menos que se especifique explícitamente en la ruta de acceso. Este comportamiento es el mismo incluso cuando se especifica una ruta de acceso con un carácter comodín.

Se pueden incluir caracteres comodín en la ruta de acceso, donde

  • La coincidencia de nombres de la ruta de acceso de caracteres comodín distingue mayúsculas de minúsculas
  • El carácter comodín se puede escapar mediante el carácter de barra diagonal inversa (\)

Nota

Para obtener el mejor rendimiento, evite especificar caracteres comodín que se expandan en un número elevado de archivos. Si es posible, enumere varias ubicaciones de archivo en lugar de especificar caracteres comodín.

Solo se pueden especificar varias ubicaciones de archivos desde el mismo contenedor y cuenta de almacenamiento a través de una lista separada por comas, por ejemplo:

  • https://<account>.blob.core.windows.net/<container\>/<path\>, https://<account\>.blob.core.windows.net/<container\>/<path\>

FILE_TYPE = { 'CSV' | 'PARQUET' }

FILE_TYPE especifica el formato de los datos externos.

  • CSV: Especifica un archivo de valores separados por comas conforme a la norma RFC 4180.
  • PARQUET: Especifica un formato Parquet.

CREDENTIAL (IDENTITY = '', SECRET = '')

CREDENTIAL especifica el mecanismo de autenticación para tener acceso a la cuenta de almacenamiento externa. En la característica Almacén de Microsoft Fabric, los únicos mecanismos de autenticación admitidos son la firma de acceso compartido (SAS) y la clave de cuenta de almacenamiento (SAK).

Nota:

Cuando se usa una cuenta de almacenamiento pública, no es necesario especificar CREDENTIAL.

  • Autenticación con firma de acceso compartido (SAS)

    • IDENTITY: constante con un valor de “firma de acceso compartido”
    • SECRET: Lafirma de acceso compartido proporciona acceso delegado a los recursos de la cuenta de almacenamiento.
    • Permisos mínimos necesarios: READ y LIST
  • Autenticación con la clave de la cuenta de almacenamiento

    • IDENTITY: constante con un valor de “clave de cuenta de almacenamiento”
    • SECRET: Clave de cuenta de almacenamiento

ERRORFILE = Ubicación del directorio

ERRORFILE solo se aplica a CSV. Especifica el directorio donde se deben escribir las filas rechazadas y el archivo de error correspondiente. Se puede especificar la ruta de acceso completa de la cuenta de almacenamiento o se puede especificar la ruta de acceso relativa al contenedor. Si la ruta de acceso especificada no existe, se crea una en su nombre. Se crea un directorio secundario con el nombre «_rejectedrows». El carácter «_» garantiza que se escape el directorio para otro procesamiento de datos a menos que se mencione explícitamente en el parámetro de ubicación.

Nota:

Cuando se pasa una ruta de acceso relativa a ERRORFILE, la ruta de acceso es relativa a la ruta de acceso del contenedor especificada en external_location.

En este directorio hay una carpeta que se crea según la hora de envío de la carga con el formato AñoMesDía-HoraMinutoSegundo (por ejemplo, 20180330-173205). En esta carpeta se crea una carpeta con el identificador de instrucción y, en esa carpeta, se escriben dos tipos de archivos: un archivo error.Json que contiene los motivos de rechazo y un archivo row.csv que contiene las filas rechazadas.

Si ERRORFILE tiene la ruta de acceso completa de la cuenta de almacenamiento definida, ERRORFILE_CREDENTIAL se usa para conectarse al almacenamiento. De lo contrario, se usa el valor mencionado para CREDENTIAL. Cuando se usa la misma credencial que se usa para los datos de origen para ERRORFILE, también se aplican restricciones que se aplican a ERRORFILE_CREDENTIAL.

ERRORFILE_CREDENTIAL = (IDENTITY= '', SECRET = '')

ERRORFILE_CREDENTIAL solo se aplica a los archivos CSV. En el almacenamiento de Microsoft Fabric, el único mecanismo de autenticación admitido es Firma de acceso compartido (SAS).

  • Autenticación con firmas de acceso compartido (SAS)
    • IDENTITY: constante con un valor de “firma de acceso compartido”
    • SECRET: Lafirma de acceso compartido proporciona acceso delegado a los recursos de la cuenta de almacenamiento.
    • Permisos mínimos necesarios: READ, LIST, WRITE, CREATE, DELETE

Nota

Si usa la misma cuenta de almacenamiento para ERRORFILE y especifica la ruta de acceso de ERRORFILE relativa a la raíz del contenedor, no es necesario especificar ERROR_CREDENTIAL.

MAXERRORS = max_errors

MAXERRORS especifica el número máximo de filas de rechazo permitidas en la carga antes de que se produzca un error en la operación COPY. Cada fila que no se puede importar con la operación COPY se omite y se cuenta como un error. Si no se especifica max_errors, el valor predeterminado es 0.

En Microsoft Fabric, no se puede usar MAXERRORS cuando FILE_TYPE es "PARQUET".

COMPRESSION = { 'Snappy' | 'GZIP' | 'NONE'}

COMPRESSION es opcional y especifica el método de compresión de datos para los datos externos.

  • CSV admite GZIP
  • Parquet admite GZIP y Snappy

El comando COPY detecta automáticamente el tipo de compresión según la extensión del archivo si no se especifica este parámetro:

  • .gz - GZIP

La carga de archivos comprimidos solo se admite actualmente con PARSER_VERSION 1.0.

FIELDQUOTE = 'field_quote'

FIELDQUOTE solo se aplica a CSV. Especifica un solo carácter que se usa como carácter de comilla (delimitador de cadena) en el archivo CSV. Si no se especifica, se usa el carácter de comillas (") como carácter de comillas, según define la norma RFC 4180. También se admite la notación hexadecimal para FIELDQUOTE. Los caracteres ASCII y multi byte extendidos no se admiten con UTF-8 para FIELDQUOTE.

Nota:

Los caracteres FIELDQUOTE se escapan en columnas de cadena en las que existe la presencia de un doble FIELDQUOTE (delimitador).

FIELDTERMINATOR = 'field_terminator'

FIELDTERMINATOR solo se aplica a CSV. Especifica el terminador de campo que se usa en el archivo CSV. El terminador de campo también se puede especificar mediante notación hexadecimal. El terminador de campo puede ser de varios caracteres. El terminador de campo predeterminado es una coma (,). Los caracteres ASCII y multi byte extendidos no se admiten con UTF-8 para FIELDTERMINATOR.

ROWTERMINATOR = 'row_terminator'

ROWTERMINATOR solo se aplica a CSV. Especifica el terminador de fila que se usa en el archivo CSV. El terminador de fila se puede especificar mediante notación hexadecimal. El terminador de fila puede ser de varios caracteres. Los terminadores predeterminados son \r\n, \ny \r.

El comando COPY antepone el carácter \r al especificar \n (nueva línea), lo que genera \r\n. Para especificar solo el carácter \n, use la notación hexadecimal (0x0A). Al especificar los terminadores de fila de varios caracteres en formato hexadecimal, no especifique 0x entre cada carácter.

Los caracteres ASCII y multi byte extendidos no se admiten con UTF-8 para ROWTERMINATOR.

FIRSTROW = First_row_int

FIRSTROW solo se aplica a CSV. Especifica el número de fila que se lee primero en todos los archivos del comando COPY. Los valores se inician a partir de 1, que es el valor predeterminado. Si el valor se establece en dos, se omite la primera fila de cada archivo (fila de encabezado) al cargar los datos. Las filas se omiten en función de la existencia de terminadores de fila.

ENCODING = 'UTF8' | 'UTF16'

ENCODING solo se aplica a CSV. El valor predeterminado es UTF8. Especifica el estándar de codificación de datos para los archivos cargados por el comando COPY.

PARSER_VERSION = { '1.0' | '2.0' }

PARSER_VERSION solo se aplica a CSV. El valor predeterminado es 2.0. Especifica el analizador de archivos usado para la ingesta cuando el tipo de archivo de origen es CSV. El analizador 2.0 ofrece un rendimiento mejorado para la ingesta de archivos CSV.

La versión 2.0 del analizador tiene las siguientes limitaciones:

  • No se admiten archivos CSV comprimidos
  • No se admiten archivos con codificación UTF-16
  • No se admite multicharacter o ROWTERMINATOR multibyte, FIELDTERMINATOR o FIELDQUOTE. Sin embargo, '\r\n' se acepta como un ROWTERMINATOR predeterminado.

Cuando se usa la versión 1.0 del analizador con archivos UTF-8, los terminadores multibyte y multicharacter no se admiten para FIELDTERMINATOR.

La versión 1.0 del analizador solo está disponible para la compatibilidad con versiones anteriores y solo se debe usar cuando se encuentran estas limitaciones.

Nota:

Cuando COPY INTO se usa con archivos CSV comprimidos o archivos con codificación UTF-16, COPY INTO cambia automáticamente a PARSER_VERSION 1.0, sin necesidad de acción del usuario. En el caso de los terminadores de varios caracteres en FIELDTERMINATOR o ROWTERMINATOR, se producirá un error en la instrucción COPY INTO. Use PARSER_VERSION = '1.0' si se necesitan separadores de varios caracteres.

Comentarios

COPY INTO en el almacén no permite establecer un formato de fecha para interpretar cadenas de caracteres de fecha. De forma predeterminada, se considera que todas las fechas tienen el formato mes-día-año. Para ingerir un archivo CSV con un formato de fecha diferente, use SET DATEFORMAT para especificar el formato de fecha deseado en el nivel de sesión. Para más información, vea SET DATEFORMAT (Transact-SQL).

Además, la instrucción COPY solo acepta caracteres válidos UTF-8 y UTF-16 para los parámetros de comando y datos de fila. Los archivos o parámetros de origen (como ROW TERMINATOR o FIELD TERMINATOR) que usan caracteres no válidos pueden interpretarse incorrectamente por la instrucción COPY y provocar resultados inesperados como daños en los datos u otros errores. Asegúrese de que los archivos de origen y los parámetros son compatibles con UTF-8 o UTF-16 antes de invocar la instrucción COPY.

Ejemplos

Para más información sobre el uso de COPY INTO en el almacén de Microsoft Fabric, consulte Ingesta de datos en el almacén mediante la instrucción COPY.

A. Realizar la carga desde una cuenta de almacenamiento público

El ejemplo siguiente es la forma más sencilla del comando COPY, que carga datos desde una cuenta de almacenamiento pública. En este ejemplo, los valores predeterminados de la instrucción COPY coinciden con el formato del archivo CSV del elemento de línea.

COPY INTO dbo.[lineitem]
FROM 'https://unsecureaccount.blob.core.windows.net/customerdatasets/folder1/lineitem.csv'

Los valores predeterminados del comando COPY son:

  • MAXERRORS = 0

  • COMPRESSION = descomprimido

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Importante

Internamente, COPY trata \n como si fuera \r\n. Para más información, vea la sección ROWTERMINATOR.

  • FIRSTROW = 1

  • ENCODING = 'UTF8'

  • FILE_TYPE = 'CSV'

B. Realizar la carga mediante la autenticación a través de la firma de acceso compartido (SAS)

En el ejemplo siguiente se cargan archivos que usan el avance de línea como terminador de fila, como una salida de UNIX. En este ejemplo también se usa una clave SAS para autenticarse en Azure Blob Storage.

COPY INTO test_1
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='?sv=2018-03-28&ss=bfqt&srt=sco&sp=rl&st=2016-10-17T20%3A14%3A55Z&se=2021-10-18T20%3A19%3A00Z&sig=IEoOdmeYnE9%2FKiJDSHFSYsz4AkNa%2F%2BTx61FuQ%2FfKHefqoBE%3D'),
    FIELDQUOTE = '"',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0X0A',
    ENCODING = 'UTF8',
    MAXERRORS = 10,
    ERRORFILE = '/errorsfolder'--path starting from the storage container
)

C. Realizar la carga con una lista de columnas con valores predeterminados mediante la autenticación a través de la clave de cuenta de almacenamiento (SAK)

En este ejemplo se cargan archivos que especifican una lista de columnas con valores predeterminados.

--Note when specifying the column list, input field numbers start from 1
COPY INTO test_1 (Col_one default 'myStringDefault' 1, Col_two default 1 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='<Your_account_key>'),
    --CREDENTIAL should look something like this:
    --CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET='x6RWv4It5F2msnjelv3H4DA80n0PQW0daPdw43jM0nyetx4c6CpDkdj3986DX5AHFMIf/YN4y6kkCnU8lb+Wx0Pj+6MDw=='),
    FIELDQUOTE = '"',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='0x0A',
    ENCODING = 'UTF8',
    FIRSTROW = 2
)

D. Carga de Parquet

En este ejemplo se usa un carácter comodín para cargar todos los archivos de Parquet en una carpeta.

COPY INTO test_parquet
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
WITH (
    FILE_TYPE = 'PARQUET',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>')
)

E. Realizar la carga mediante la especificación de caracteres comodín y varios archivos

COPY INTO t1
FROM
'https://myaccount.blob.core.windows.net/myblobcontainer/folder0/*.txt',
    'https://myaccount.blob.core.windows.net/myblobcontainer/folder1'
WITH (
    FILE_TYPE = 'CSV',
    CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>')
    FIELDTERMINATOR = '|'
)

Preguntas más frecuentes

¿Cuál es el procedimiento para dividir archivos a la hora de cargar archivos .csv comprimidos con el comando COPY?

Considere la posibilidad de dividir archivos CSV grandes, especialmente cuando el número de archivos es pequeño, pero mantenga los archivos como mínimo de 4 MB cada uno para mejorar el rendimiento.

¿Cuál es el procedimiento para dividir archivos a la hora de cargar archivos Parquet con el comando COPY?

Considere la posibilidad de dividir archivos parquet grandes, especialmente cuando el número de archivos es pequeño.

¿Hay alguna limitación en el número o el tamaño de los archivos?

No hay limitaciones en cuanto al número o tamaño de los archivos. Sin embargo, para obtener el mejor rendimiento, se recomienda usar archivos que tengan al menos 4 MB.

Pasos siguientes