Tema SQL
STUFF() (SQL Server)
Inserta una cadena dentro de otra eliminando un número de caracteres desde una posición inicial. Complemento habitual de FOR XML PATH para concatenar filas en T-SQL.
Descripción
STUFF(cadena, inicio, longitud_borrar, reemplazo) modifica in-place lógico; posiciones 1-based. Si longitud es 0, inserta sin borrar. Usado con FOR XML PATH con cadena vacía y TYPE para STRING_AGG manual antes de SQL Server 2017. Validar longitudes negativas o rangos fuera de cadena. En otros motores SUBSTRING + concat o funciones propias.
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.
STUFF(cadena, posición_inicio, longitud_eliminar, cadena_insertar)
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.
- 1-based
- La primera posición es 1, no 0.
- STRING_AGG
- Preferible desde 2017 para agregar texto con separador.
Ejemplos
Ejemplo 1
SELECT STUFF('abcdef', 3, 2, 'ZZ');
SELECT STUFF(nombre, 1, 1, UPPER(LEFT(nombre, 1)))
FROM usuarios;
Ejemplo 2
SELECT STUFF((SELECT ',' + nombre FROM tags t FOR XML PATH(''), TYPE).query('.').value('.', 'NVARCHAR(MAX)'),1,1,'') AS lista;
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.