Tema SQL
STRING_SPLIT() (SQL Server)
Divide una cadena en filas por un separador (2016+). Devuelve una columna value; en versiones recientes admite ordinal habilitando compatibilidad.
Descripción
STRING_SPLIT(cadena, separador) reemplaza trucos XML para trocear listas. El separador es un carácter; para multichar usa workarounds o CLR. No garantiza orden sin ordinal en versiones antiguas. Cuidado con listas enormes en IN: puede ser menos eficiente que tabla temporal. MySQL recursive CTE o JSON_TABLE; PostgreSQL string_to_array + unnest.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
SELECT value FROM STRING_SPLIT('a,b,c', ',');
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Ordinal
- En 2022+ ENABLE_ORDINAL puede añadir índice de token.
- Vacío
- Separadores consecutivos pueden producir filas vacías según versión.
Ejemplos
Ejemplo 1
SELECT TRIM(value) AS tag
FROM STRING_SPLIT('sql, etl, bi', ',')
WHERE TRIM(value) <> '';
SELECT *
FROM pedidos
WHERE id IN (SELECT CAST(value AS INT) FROM STRING_SPLIT(@ids, ','));
Ejemplo 2
SELECT CAST(value AS INT) AS id
FROM STRING_SPLIT('10,20,30,', ',')
WHERE TRY_CAST(value AS INT) IS NOT NULL;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.