Funciones Niládicas

Muchas veces, ya por costumbre, escribimos código TRANSACT SQL de manera natural y no reparamos en la sintaxis que utilizamos. Pues bien, hace algún tiempo durante una clase me pasó que, al escribir “de manera natural” código TRANSACT SQL, me topé con una pregunta que me hizo un alumno al variar el uso de la omnipresente función no determinística GETDATE() por una función que leyó en la Internet llamada CURRENT_TIMESTAMP, la cual en teoría le debía, en teoría, proveer el mismo resultado. Grande fue la sorpresa del alumno al notar que el reemplazo simple le generaba un error de sintaxis:

Después de unos segundos de pensar en el error, caí en la cuenta que dicha función no requería de paréntesis, a diferencia del común de las funciones que estaba acostumbrado a usar. Mi respuesta fue en ese momento que dicha función era una función especial, pero la verdad era que no sabía que la hacía especial.  Luego de investigar por varios lares, encontré no mucha información sustancial al respecto, por lo que fue necesario recurrir al oráculo (no, no es Oracle) del conocimiento en funcionamiento interno de SQL Server: Kalen Delaney. Si no conocen quién es entonces no conocen el funcionamiento interno de SQL Server y en caso sea así, pueden leerla en su blog http://sqlblog.com/blogs/kalen_delaney/.

Bien, luego de la pequeña investigación que comenté líneas arriba me di cuenta también que algunas funciones de tipo tabla (table valued functions) también requerían sintaxis especial. Decidí escribirle un mensaje de correo indicándole mis dudas y esta fue su respuesta:

En resumen, lo que Kalen Delaney indica es que las funciones llevan paréntesis dado que estas podían llevar un parámetro opcional, pero que aquellas funciones sin paréntesis (y que por ende no pueden recibir parámetros) se denominan NILADIC (niládicas en español) y fueron creadas en SQL Server 6.0 para ser usadas como valor por defecto en las restricciones de tipo DEFAULT. Esa es la razón de ser (y de su sintaxis) de estas funciones. Si bien, ya había resuelto el misterio de la falta de paréntesis al usar estas funciones aún me quedaba algo de duda acerca de la etimología del nombre. Bien, resulta que NIL en idioma inglés es una palabra descendiente del latín que es sinónimo de nada, nulo o cero y ADIC, cuando es usada como sufijo significa argumento o parámetro, por lo que función NILADIC vendría a significar función sin argumentos o parámetros.

Bien, pero ahí no termina el tema, averiguando un poco más del tema, no solamente existen funciones NILADIC (niládicas en español) sino existen también clasificaciones derivadas. Una de las clasificaciones empleadas en el estándar SQL: 2006 incluye términos como MONADIC (monádicas) y DYADIC (diádicas), en referencia a las funciones que reciben uno y dos argumentos respectivamente. Aunque matemáticamente correcto y útil para la normalización, esta

clasificación no satisface las necesidades de un desarrollador que se preocupa principalmente con el tipo de argumentos de una función y lo que ésta retorna.

En conclusión, el uso para el que estas funciones fueron creadas sería algo como lo siguiente:

Esto no significa que actualmente las funciones NON-NILADIC (no niládicas) no puedan ser utilizadas como parámetros en restricciones de tipo DEFAULT, actualmente es posible usarlas sin ningún problema, sin embargo es prudente recordar que el origen de estas funciones data de una versión de hace más de 15 años atrás.

A continuación una pequeña lista de las funciones NILADIC más comunes:

  • CURRENT_TIMESTAMP retorna la fecha y hora actual.
  • CURRENT_USER retorna el nombre del usuario de base de datos actualmente logueado.
  • SESSION_USER retorna el nombre del usuario de base de datos actualmente logueado.
  • USER retorna el nombre del usuario de base de datos actualmente logueado.
  • SYSTEM_USER retorna el nombre del inicio de sesión (LOGIN) de servidor actualmente logueado.

2 comentarios en “Funciones Niládicas

Deja un comentario

Tu dirección de correo electrónico no será publicada.