Cómo cargar datos con COPY INTO en Azure Synapse
El comando COPY INTO es la forma más rápida y sencilla de cargar archivos CSV o Parquet desde tu Data Lake a una tabla de un Dedicated SQL Pool en Azure Synapse. En una sola instrucción T-SQL sustituyes pipelines complejos y obtienes una ingesta de alto rendimiento, sin aprovisionar recursos adicionales. Aprenderás a preparar la tabla de destino, escribir el comando COPY INTO y validar los datos cargados.
Requisitos previos
- Un Dedicated SQL Pool activo en tu workspace de Azure Synapse.
- Archivos de datos (CSV o Parquet) en una cuenta de Azure Data Lake Storage Gen2 o Blob Storage.
- Permisos de escritura en la base de datos y acceso de lectura al almacenamiento (por ejemplo, mediante una Managed Identity).
- Un editor SQL: Synapse Studio, Azure Data Studio o SQL Server Management Studio (SSMS).
Paso 1: Crear la tabla de destino
Antes de cargar datos, necesitas una tabla cuyas columnas coincidan con las del archivo, en el mismo orden. Elige los tipos de datos con cuidado: las columnas demasiado anchas desperdician memoria y degradan el rendimiento en el Dedicated SQL Pool. En este ejemplo usamos DISTRIBUTION = ROUND_ROBIN, que reparte las filas de forma uniforme — una buena opción para tablas de staging — y un CLUSTERED COLUMNSTORE INDEX, ideal para grandes volúmenes analíticos.
CREATE TABLE dbo.Sales
(
SaleID INT NOT NULL,
SaleDate DATE NOT NULL,
Product NVARCHAR(100) NOT NULL,
Quantity INT NOT NULL,
Amount DECIMAL(10,2) NOT NULL
)
WITH
(
DISTRIBUTION = ROUND_ROBIN,
CLUSTERED COLUMNSTORE INDEX
);
Paso 2: Configurar el acceso al almacenamiento
COPY INTO necesita autenticación para leer los archivos. La opción más simple y segura es la Managed Identity del workspace. Solo tienes que asignar al workspace el rol Storage Blob Data Contributor en la cuenta de almacenamiento, en el portal de Azure. Así no gestionas claves ni secretos dentro del código.
Consejo: la Managed Identity evita guardar claves de almacenamiento en tu SQL. Es el enfoque recomendado en entornos de producción.
Paso 3: Ejecutar COPY INTO
Con la tabla creada y los permisos asignados, ejecuta el comando. Este ejemplo carga todos los archivos Parquet de una carpeta del Data Lake:
COPY INTO dbo.Sales
FROM 'https://mystorageaccount.dfs.core.windows.net/data/sales/'
WITH
(
FILE_TYPE = 'PARQUET',
CREDENTIAL = (IDENTITY = 'Managed Identity')
);
Cuando apuntas a una carpeta, COPY INTO lee todos los archivos que contiene; para un único archivo, indica la ruta completa. Si tus datos están en CSV con encabezado, indica el tipo de archivo y salta la primera fila:
COPY INTO dbo.Sales
FROM 'https://mystorageaccount.dfs.core.windows.net/data/sales.csv'
WITH
(
FILE_TYPE = 'CSV',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0A'
);
FIRSTROW = 2 ignora la fila de encabezado; FIELDTERMINATOR define el separador de columnas y ROWTERMINATOR el fin de línea.
Paso 4: Gestionar filas con errores
Los archivos reales casi siempre contienen valores inesperados. Usa la opción ERRORFILE para que las filas rechazadas se guarden en lugar de hacer fallar toda la carga:
COPY INTO dbo.Sales
FROM 'https://mystorageaccount.dfs.core.windows.net/data/sales.csv'
WITH
(
FILE_TYPE = 'CSV',
FIRSTROW = 2,
MAXERRORS = 10,
ERRORFILE = 'https://mystorageaccount.dfs.core.windows.net/rejected/'
);
Con MAXERRORS = 10, la carga continúa hasta 10 filas no válidas; por encima de eso, falla. Las filas problemáticas quedan en la carpeta indicada en ERRORFILE, para que puedas analizarlas más tarde.
Verificar el resultado
Después de ejecutar el comando, comprueba cuántas filas entraron en la tabla:
SELECT COUNT(*) AS TotalRows FROM dbo.Sales;
Compara el número con el total esperado de los archivos. También puedes echar un vistazo a algunos registros con SELECT TOP 10 * FROM dbo.Sales; para confirmar que las columnas quedaron alineadas y los tipos correctos. Si ves un error de conversión, revisa los tipos de la tabla o el separador del CSV.
Conclusión
Con COPY INTO obtienes un método de ingesta rápido, seguro y sin infraestructura adicional para alimentar tu Dedicated SQL Pool. A partir de aquí, puedes programar este comando dentro de un Synapse Pipeline para automatizar cargas diarias, o combinarlo con una tabla de staging antes de aplicar transformaciones. ¿Ya has pensado en qué columna de tu archivo sería la mejor clave de distribución?