Compartir a través de


COPIAR EN (Transact-SQL)

Se aplica a:Azure Synapse Analytics

Este artículo explica cómo usar la COPY sentencia en Azure Synapse Analytics para cargar desde cuentas de almacenamiento externas. La COPY declaración ofrece la mayor flexibilidad para la ingesta de datos de alto rendimiento en Azure Synapse Analytics.

Note

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)
  • Usa una cuenta de almacenamiento diferente para la ERRORFILE ubicación (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.
  • Cargar directamente tipos de datos complejos desde archivos Parquet, como Mapas y listas en columnas de cadena, sin usar otras herramientas para preprocesar los datos

Note

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:

Note

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

Syntax

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' } ]
)

Arguments

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 la operación 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_value predeterminado] [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\>

Note

El .blob punto de conexión también está disponible para ADLS Gen2 y actualmente produce el mejor rendimiento. Use el punto de conexión de .blob cuando no se requiera .dfs para el 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

Note

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

Note

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.

CREDENCIAL (IDENTIDAD = '', SECRETO = '')

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/PRINCIPAL DE SERVICIO/KEY/Entra SAS/KEY SAS/KEY
Azure Data Lake Gen2 SAS/MSI/PRINCIPAL DE SERVICIO/KEY/Entra SAS (blob 1 )/MSI (dfs 2 )/PRINCIPAL DE SERVICIO/KEY/Entra SAS (blob 1 )/MSI (dfs 2 )/PRINCIPAL DE SERVICIO/KEY/Entra

1 Es necesario el punto de conexión de blob (.blob.core.windows.net) en la ruta de acceso de ubicación externa para este método de autenticación.

2 El punto de conexión de dfs (.dfs.core.windows.net) en la ruta de acceso de ubicación externa es necesario para este método de autenticación.

Note

  • 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: lafirmade 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

    • IDENTIDAD: <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 el directorio se escape para otro procesamiento de datos, a menos que se indique explícitamente el nombre en el parámetro location.

Note

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 = (IDENTIDAD= '', SECRETO = '')

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/Entra

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

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

    • IDENTITY: constante con un valor de “firma de acceso compartido”
    • SECRET: lafirmade 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

    • IDENTIDAD: <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

Note

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.

Note

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) siguen provocando COPY INTO un error, omiiendo 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 - Rápido
  • .deflate - DefaultCodec (solo Parquet y ORC)

El comando COPY requiere que los archivos gzip no contengan elementos no utilizados finales para funcionar normalmente. El formato gzip requiere estrictamente que los archivos se componen de miembros válidos sin ninguna información adicional antes, entre o después de ellos. Cualquier desviación de este formato, como la presencia de datos finales que no son gzip, producirá el error del comando COPY. Asegúrese de comprobar que no hay elementos no utilizados finales al final de los archivos gzip para asegurarse de que COPY puede procesar correctamente estos archivos.

CITA DE CAMPO = '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.

Note

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.

TERMINADOR DE FILA = '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.

PRIMERA FILA = 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.

CODIFICACIÓN = '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' | 'FUERA'

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

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.

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 COPY INTO proceso crea automáticamente una nueva tabla al descubrir 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. Default.

Note

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.

Permissions

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

Remarks

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.

La MAXDOP hint de consulta no está soportada con COPY INTO.

Para garantizar una ejecución confiable, los archivos y carpetas de origen deben permanecer sin cambios durante la duración de la COPY INTO operación.

  • Modificar, eliminar o reemplazar los archivos o carpetas a los que se hace referencia mientras se ejecuta el comando puede provocar un error en la operación o provocar una ingesta de datos incoherente.
  • Antes de ejecutar COPY INTO, compruebe que todos los datos de origen son estables y no se modificarán durante el proceso.

Examples

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

El siguiente ejemplo es la forma más sencilla del COPY comando, que carga datos desde una cuenta pública de almacenamiento. 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

  • CITA DE campo = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Important

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

  • PRIMERA FILA = 1

  • CODIFICACIÓN = 'UTF8'

  • FILE_TYPE = 'CSV'

  • IDENTITY_INSERT = 'APAGADO'

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

FAQ

¿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 grandes CSV podría seguir beneficiando 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 #Files
100 60
200 60
300 60
400 60
500 60
1,000 120
1,500 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. Además, limite el recuento de archivos de origen a un máximo de 5000 archivos para mejorar el rendimiento.

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

Si tiene un área de trabajo de Azure Synapse que se creó antes del 7 de diciembre de 2020, es posible que se produzca un mensaje de error similar al autenticarse mediante 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
    

Se aplica a:Warehouse en 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, se admiten las cuentas de Azure Data Lake Storage Gen2 y los orígenes de OneLake.

Para más información sobre cómo usarlo COPY INTO en tu Warehouse en Microsoft Fabric, consulta Ingesta de datos en tu Warehouse usando la instrucción COPY.

De forma predeterminada, COPY INTO se autentica como el usuario que ejecuta Entra ID.

Úsalo COPY para las siguientes capacidades:

  • 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).
  • Usa una cuenta de almacenamiento diferente para la ERRORFILE ubicación (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.
  • Especifica un terminador de fila personalizado, un terminador de campo y una cita de campo para 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.

Syntax

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 ]
 [ , DATEFORMAT = 'date_format' ]
 [ , ENCODING = { 'UTF8' | 'UTF16' } ]
 [ , PARSER_VERSION = { '1.0' | '2.0' } ]
 [ , MATCH_COLUMN_COUNT = { 'ON' | 'OFF' } ]
)

Arguments

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 el almacén no está especificado y el esquema y la tabla especificados no existen en el almacén actual, COPY falla 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 el esquema no está especificado y el esquema por defecto del usuario que realiza la COPY operación es diferente del esquema de la tabla especificada, COPY se cancela y se devuelve un mensaje de error.

table_name

El nombre de la tabla a la que COPY se puede dar 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_value predeterminado] [Field_number] [,... n])]

  • Column_name: el nombre de la columna en la tabla de destino.
  • Default_value - el valor por defecto que reemplaza cualquier NULL valor en el archivo de entrada. El valor predeterminado se aplica a todos los formatos de archivo. COPY Intenta cargar NULL desde el archivo de entrada cuando una columna se omite 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 column_list no se especifica, COPY mapea las columnas según el orden de origen y objetivo: el campo de entrada 1 va a la columna objetivo 1, el campo 2 a la columna 2, etc.

Note

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 mapea columnas según el orden de origen y objetivo: el campo de entrada 1 va a la columna objetivo 1, el campo 2 a la columna 2, etc.

Ubicación externa

Especifica el lugar donde se almacenan provisionalmente los archivos que contienen los datos. Actualmente, Se admiten Azure Data Lake Storage (ADLS), Azure Blob Storage y OneLake (versión preliminar):

  • 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\>
  • Ubicación externa para OneLake (versión preliminar): https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/

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.

Note

El .blob punto de conexión también está disponible para ADLS Gen2 y actualmente produce el mejor rendimiento. Use el punto de conexión de blob cuando no se requiera dfs para el 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 de todas sus subcarpetas. COPY ignora carpetas ocultas y no devuelve archivos que comiencen con subrayado (_) o punto (.) a menos que se especifique explícitamente en la ruta. 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 (\)

Note

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\>

Ubicaciones externas detrás del firewall

Para acceder a los archivos de Azure Data Lake Storage (ADLS) Gen2 y las ubicaciones de Azure Blob Storage que están detrás de un firewall, se aplican los siguientes requisitos previos:

  • Se debe aprovisionar una identidad de área de trabajo para el área de trabajo que hospeda el almacenamiento. Para más información sobre cómo configurar una identidad de área de trabajo, consulte Identidad del área de trabajo.
  • La cuenta de Id. de Entra debe poder usar la identidad del área de trabajo.
  • La cuenta de Entra ID debe tener acceso a los archivos subyacentes mediante el control de acceso basado en rol (RBAC) de Azure o las ACL del lago de datos.
  • El área de trabajo de Fabric que hospeda el almacenamiento debe agregarse como regla de instancia de recurso. Para más información sobre cómo agregar el área de trabajo de Fabric con una regla de instancia de recurso, consulte Regla de instancia de recurso.

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.

CREDENCIAL (IDENTIDAD = '', SECRETO = '')

CREDENTIAL Especifica el mecanismo de autenticación para acceder a la cuenta de almacenamiento externa.

En Fabric Data Warehouse:

  • COPY INTO no se admite cuando el acceso público está deshabilitado.
  • En el caso de las cuentas de almacenamiento públicas, los mecanismos de autenticación admitidos son el identificador de Microsoft Entra, la firma de acceso compartido (SAS) o la clave de cuenta de almacenamiento (SAK).
  • En el caso de las cuentas de almacenamiento público detrás de un firewall, la autenticación de identificador de Microsoft Entra es el único método de autenticación admitido. COPY INTO el uso de OneLake como fuente solo admite la autenticación EntraID.

La autenticación EntraID del usuario es predeterminada. No es necesario especificar ninguna credencial.

  • Autenticación con firma de acceso compartido (SAS)
    • IDENTITY: Una constante con un valor de 'Firma de acceso compartido'.
    • SECRET: la firma de acceso compartido proporciona acceso delegado a los recursos de la cuenta de almacenamiento.
    • Permisos mínimos requeridos: READ y LIST.
  • Autenticación con clave de cuenta de almacenamiento
    • IDENTITY: Una 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 el directorio se escape para otro procesamiento de datos, a menos que se indique explícitamente el nombre en el parámetro location.

Note

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.

Dentro de este directorio, hay una carpeta creada en función del tiempo de envío de carga en el formato YearMonthDay -HourMinuteSecond (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.

Cuando se usa una cuenta de Azure Storage protegida por firewall, el archivo de error se crea en el mismo contenedor especificado en la ruta de acceso de la cuenta de almacenamiento. Al considerar el uso de la opción ERRORFILES en este escenario, también es necesario especificar el parámetro MAXERROR de. 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.

ERRORFILE_CREDENTIAL = (IDENTIDAD= '', SECRETO = '')

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: lafirmade acceso compartido proporciona acceso delegado a los recursos de la cuenta de almacenamiento.
  • Permisos mínimos necesarios: READ, LIST, WRITE, CREATE, DELETE

Note

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 falle la COPY operación. Cada fila que la COPY operación no puede importar se ignora y cuenta como un error. Si no se especifica max_errors, el valor predeterminado es 0.

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

COMPRESIÓN = { 'Snappy' | 'GZIP' | 'NINGUNA'}

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 COPY comando detecta automáticamente el tipo de compresión basándose en la extensión del archivo cuando este parámetro no está especificado:

  • .gz - GZIP

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

El COPY comando requiere que los archivos gzip no contengan basura residual para funcionar normalmente. El formato gzip requiere estrictamente que los archivos se componen de miembros válidos sin ninguna información adicional antes, entre o después de ellos. Cualquier desviación de este formato, como la presencia de datos posteriores no gzip, resultará en el fallo del COPY comando. Asegúrate de comprobar que no haya basura residual al final de los archivos gzip para poder COPY procesarlos correctamente.

CITA DE CAMPO = '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.

Note

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 COPY comando prefija el \r carácter al especificar \n (nueva línea), resultando en \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.

PRIMERA FILA = First_row_int

FIRSTROW solo se aplica a CSV. Especifica el número de fila que se lee primero en todos los archivos del COPY comando. 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 COPY comando tiene prioridad sobre DATEFORMAT configurado a nivel de sesión.

CODIFICACIÓN = '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 COPY comando.

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
  • Multipersonaje o multibyte ROWTERMINATOR, FIELDTERMINATOR, o FIELDQUOTE no es compatible. Sin embargo, \r\n se acepta como predeterminado ROWTERMINATOR.

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.

Note

Cuando COPY INTO se usa con archivos CSV comprimidos o con codificación UTF-16, COPY INTO cambia automáticamente a PARSER_VERSION la versión 1.0, sin necesidad de acción del usuario. Para terminadores de varios caracteres en FIELDTERMINATOR o ROWTERMINATOR, la COPY INTO sentencia fallará. Úsalo PARSER_VERSION = '1.0' si se necesitan separadores de varios caracteres.

MATCH_COLUMN_COUNT = { 'ON' | 'OFF' }

MATCH_COLUMN_COUNT solo se aplica a CSV. El valor predeterminado es OFF. Especifica si el comando COPY debe comprobar si las filas de recuento de columnas de los archivos de origen coinciden con el recuento de columnas de la tabla de destino. Se aplica el siguiente comportamiento:

  • Si MATCH_COLUMN_COUNT es OFF:
    • Se omite la superación de columnas de filas de origen.
    • Las filas con menos columnas se insertan como null en columnas que aceptan valores NULL.
    • Si no se proporciona un valor a una columna no anulable, el COPY comando falla.
  • Si MATCH_COLUMN_COUNT es ON:
    • El COPY comando comprueba si el conteo de columnas en cada fila de cada archivo desde el archivo fuente coincide con el conteo de columnas de la tabla de destino.
  • Si hay una discrepancia en el número de columnas, el COPY comando falla.

Note

MATCH_COLUMN_COUNT funciona independientemente de MAXERRORS. Una falta de coincidencia de recuento de columnas hace que se produzca un error COPY INTO independientemente de MAXERRORS.

Uso de COPY INTO con OneLake

Puede usar COPY INTO para cargar datos directamente desde archivos almacenados en Fabric OneLake, específicamente desde la carpeta Files de fabric Lakehouse. Esto elimina la necesidad de cuentas de almacenamiento provisional externas (como ADLS Gen2 o Blob Storage) y habilita la ingesta nativa del área de trabajo y controlada por el área de trabajo mediante permisos de Fabric. Esta funcionalidad admite:

  • Lectura desde Files carpetas en Lakehouses
  • Cargas de área de trabajo a almacenamiento dentro del mismo inquilino
  • Cumplimiento de identidades nativas mediante el identificador de Entra de Microsoft

Example:

COPY INTO t1
FROM 'https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/*.csv'
WITH (
    FILE_TYPE = 'CSV',
    FIRSTROW = 2
);

Permissions

Permisos del plano de control

Para ejecutar el comando COPY INTO, se debe conceder a un usuario la pertenencia a un rol de área de trabajo a través de Administrar el acceso en el área de trabajo, con al menos el rol Visor. Como alternativa, el acceso de almacenamiento se puede compartir con un usuario a través de permisos de elemento en el portal de Fabric, con al menos permisos de lectura. Para alinearse con el principio de privilegios mínimos, el permiso de lectura es suficiente.

Permisos del plano de datos

Una vez que se haya concedido al usuario permisos del plano de control a través de roles de área de trabajo o permisos de elemento, si solo tienen permisos de lectura en el nivel de plano de datos , también se debe conceder al usuario permisos INSERT y ADMINISTER DATABASE BULK OPERATIONS a través de comandos T-SQL.

Por ejemplo, el siguiente script de T-SQL concede estos permisos a un usuario individual a través de su identificador de Microsoft Entra.

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

GRANT INSERT to [mike@contoso.com];
GO

Al usar la opción ErrorFile, el usuario debe tener el permiso mínimo de Colaborador de Blob Storage en el contenedor de la cuenta de almacenamiento.

Al usar OneLake como origen, el usuario debe tener permisos De colaborador o superior en el área de trabajo de origen (donde se encuentra Lakehouse) y el área de trabajo de destino (donde reside el almacén). Todo el acceso se rige a través del identificador de Entra de Microsoft y los roles del área de trabajo de Fabric.

Remarks

La COPY instrucción solo acepta caracteres válidos UTF-8 y UTF-16 para los datos de fila y parámetros de comando. Los archivos fuente o parámetros (como ROW TERMINATOR o FIELD TERMINATOR) que usan caracteres inválidos pueden interpretarse incorrectamente por la COPY sentencia y causar resultados inesperados como corrupción de datos u otros fallos. Asegúrate de que tus archivos fuente y parámetros cumplan con UTF-8 o UTF-16 antes de invocar la COPY sentencia.

La COPY INTO sentencia tiene restricciones sobre el tamaño de las columnas varchar(max) y varbinary(max ) individuales, así como sobre el tamaño total de fila que se puede ingerir.

  • Parquet: tamaño máximo de columna varchar(max)/varbinary(max ) 16MB, tamaño máximo de fila 1GB.
  • CSV: tamaño máximo de columna varchar(max)/varbinary(max ) 1MB, tamaño máximo de fila 16MB.

Para garantizar una ejecución confiable, los archivos y carpetas de origen deben permanecer sin cambios durante la duración de la COPY INTO operación.

  • Modificar, eliminar o reemplazar los archivos o carpetas a los que se hace referencia mientras se ejecuta el comando puede provocar un error en la operación o provocar una ingesta de datos incoherente.
  • Antes de ejecutar COPY INTO, compruebe que todos los datos de origen son estables y no se modificarán durante el proceso.

Limitaciones de OneLake como origen

Fabric OneLake Storage como origen para y COPY INTOOPENROWSET(BULK) es una característica en versión preliminar.

  • Sólo se admite la autenticación Microsoft Entra ID. No se permiten otros métodos de autenticación, como tokens de SAS, claves compartidas o cadenas de conexión.

  • Solo se admite la Files carpeta de lakehouse como origen. El acceso a subcarpetas, accesos directos u otras ubicaciones de OneLake no está disponible actualmente.

  • Las rutas oneLake deben usar identificadores de área de trabajo y almacenamiento. En este momento no se admiten nombres descriptivos para áreas de trabajo o Lakehouses.

  • Los permisos de colaborador son necesarios en ambas áreas de trabajo. El usuario que ejecuta debe tener al menos el rol Colaborador en el área de trabajo de Source Lakehouse y en el área de trabajo De almacenamiento de destino.

Examples

Para más información sobre cómo usarlo COPY INTO en tu Warehouse en Microsoft Fabric, consulta Ingesta de datos en tu Warehouse usando la instrucción COPY.

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

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

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

Los valores por defecto del COPY comando son:

  • MAXERRORS = 0

  • COMPRESSION por defecto es sin comprimir

  • FIELDQUOTE = '"'

  • FIELDTERMINATOR = ','

  • ROWTERMINATOR = '\n'

Important

COPY Trata \n como \r\n internamente. Para obtener 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 Parquet en una carpeta mediante el identificador entra del usuario en ejecución.

COPY INTO test_parquet
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
WITH (
    FILE_TYPE = 'PARQUET'
)

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 = '|'
)

F. Carga de datos desde OneLake (versión preliminar pública)

COPY INTO t1
FROM 'https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/*.csv'
WITH (
    FILE_TYPE = 'CSV',
    FIRSTROW = 2
);

FAQ

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

¿Qué método de autenticación se usa cuando no se especifica una credencial?

De forma predeterminada, COPY INTO usa el identificador entra del usuario en ejecución.