135 - Funciones escalares (crear y llamar)


Problema:

Una empresa tiene almacenados los datos de sus empleados en una tabla denominada "empleados".
Eliminamos la tabla, si existe y la creamos con la siguiente estructura:

 if object_id('empleados') is not null
  drop table empleados;

 create table empleados(
  documento char(8) not null,
  nombre varchar(30),
  fechaingreso datetime,
  mail varchar(50),
  telefono varchar(12)
 );

Ingresamos algunos registros:

 insert into empleados values('22222222', 'Ana Acosta','1985/10/10','anaacosta@gmail.com','4556677');
 insert into empleados values('23333333', 'Bernardo Bustos', '1986/02/15',null,'4558877');
 insert into empleados values('24444444', 'Carlos Caseros','1999/12/02',null,null);
 insert into empleados values('25555555', 'Diana Dominguez',null,null,'4252525');

Eliminamos, si existe, la función "f_fechaCadena":

 if object_id('dbo.f_fechaCadena') is not null
  drop function dbo.f_fechaCadena;

Creamos una función a la cual le enviamos una fecha (de tipo varchar), en el cuerpo de la función se analiza si el dato enviado corresponde a una fecha, si es así, se almacena en una variable el mes (en español) y se le concatenan el día y el año y se retorna esa cadena; en caso que el valor enviado no corresponda a una fecha, la función retorna la cadena 'Fecha inválida':

 create function f_fechaCadena
 (@fecha varchar(25))
  returns varchar(25)
  as
  begin
    declare @nombre varchar(25)
    set @nombre='Fecha inválida'   
    if (isdate(@fecha)=1)
    begin
      set @fecha=cast(@fecha as datetime)
      set @nombre=
      case datename(month,@fecha)
       when 'January' then 'Enero'
       when 'February' then 'Febrero'
       when 'March' then 'Marzo'
       when 'April' then 'Abril'
       when 'May' then 'Mayo'
       when 'June' then 'Junio'
       when 'July' then 'Julio'
       when 'August' then 'Agosto'
       when 'September' then 'Setiembre'
       when 'October' then 'Octubre'
       when 'November' then 'Noviembre'
       when 'December' then 'Diciembre'
      end--case
      set @nombre=rtrim(cast(datepart(day,@fecha) as char(2)))+' de '+@nombre
      set @nombre=@nombre+' de '+ rtrim(cast(datepart(year,@fecha)as char(4)))
    end--si es una fecha válida
    return @nombre
 end;

Recuperamos los registros de "empleados", mostrando el nombre y la fecha de ingreso empleando la función creada anteriormente:

 select nombre, dbo.f_fechaCadena(fechaingreso) as ingreso from empleados;

Note que el registro con valor nulo en el campo "fechaingreso" muestra "fecha inválida".

Empleamos la función en otro contexto:

 select dbo.f_fechaCadena(getdate());



Retornar