Funciones de Tabla y Retorno de Conjuntos (Table-Valued Functions)
Mientras que las funciones escalares devuelven un único valor primitivo (un número, una fecha o una cadena), las Funciones de Tabla (Table-Valued Functions / TVF) devuelven un conjunto completo de filas y columnas (un dataset o tabla virtual).
Actúan en la práctica como «vistas parametrizadas», permitiendo encapsular consultas complejas con argumentos de entrada y reutilizarlas directamente dentro de la cláusula FROM o combinarlas con operadores como LATERAL y CROSS APPLY.
1. Función Escalar vs. Función de Tabla #
| Tipo de Función | Tipo de Retorno | Dónde se utiliza | Ejemplo de uso |
|---|---|---|---|
| Función Escalar | Valor único (INT, TEXT, BOOLEAN) | En SELECT, WHERE, ORDER BY | SELECT calcular_iva(precio) FROM productos; |
| Función de Tabla (TVF) | Tabla con esquema (RETURNS TABLE (...) o SETOF) | En la cláusula FROM, JOIN, LATERAL | SELECT * FROM obtener_pedidos_cliente(101); |
2. Ejemplos de Implementación Multi-Motor #
3. Combinación Avanzada con LATERAL y CROSS APPLY #
Una de las características más potentes de las funciones de tabla es combinarlas con otras tablas pasando columnas de la tabla exterior como parámetros a la función:
LATERAL/CROSS APPLY: Evalúa la función de tabla para cada fila de la tabla de clientes, similar a un bucleFOR EACHoptimizado internamente por el motor relacional.
Resumen del tema
Conceptos clave #
- Table-Valued Function (TVF): rutina que retorna un conjunto estructurado de filas y columnas, comportándose como una vista parametrizada.
- Uso en
FROM: permite invocar la función pasando argumentos dinámicos y filtrar/ordenar el resultado con sentencias SQL estándar. LATERAL/CROSS APPLY: operador que permite correlacionar columnas de una tabla padre con los parámetros de entrada de la función de tabla.- Reutilización: encapsula consultas complejas con filtros específicos de forma limpia y mantenible.
Qué debes recordar #
Utiliza funciones de tabla cuando necesites vistas con parámetros de entrada o cuando requieras correlacionar conjuntos dinámicos de filas por cada registro padre mediante LATERAL o CROSS APPLY.