Vous êtes sur la page 1sur 5

Funciones con SQL Server

Una funcin es una rutina almacenada que recibe unos parmetros escalares
de entrada, los procesa segn la definicin de la funcin y por finalmente
retorna en un resultado de un tipo especfico que permitir su utilizacin con un
objetivo.
Las funciones definidas por el usuario en SQL Server permiten retornar
tablas en los resultados. Esta caracterstica proporciona al programador
facilidad a la hora de administrar sus bases de datos.

Existen tres tipos de funciones:


Funciones escalares
Funciones con valores de tabla en lnea
Funciones con valores de tabla y mltiples instrucciones
La sintaxis de creacin de las tres es muy similar, slo se diferencian en el tipo
de parmetros que retornan.

Funciones escalares
Las funciones escalares son aquellas que reciben parmetros de entrada para
ser procesados y al final retornar en un valor con un tipo de dato sencillo. Es
decir un tipo de dato elemental como INT, FLOAT, VARCHAR, etc. Pues SQL
Server no permite que este tipo de funciones retorne valores de tipo text, ntext,
image, cursor y timestamp. Utilizaremos la palabra reservada Returns para
indicar el tipo de dato en el cual retornar la funcin. El cuerpo de una funcin
escalar estar contenido en un bloque de instrucciones como en
los procedimientos almacenados.

Ejemplo.
CREATE FUNCTION [DBO].[Nombre_Funcion]
(
@ID
AS VARCHAR(7),
@nombre
AS VARCHAR (70),
@tipo
AS CHAR (2)
)
RETURNS VARCHAR(6)
AS
BEGIN
--Aqu puede ir cualquier cdigo de SQL Server
DECLARE @Valor_Retorno AS VARCHAR(6)
DECLARE @Valor_Intermedio AS VARCHAR(6)
@Valor_Intermedio
= SELECT Valor FROM DBO.tbTabla WHERE strCod = @ID ANDstrNomb
re = @nombre AND strTipo = @tipo
SET @Valor_Retorno = @Valor_Intermedio
RETURN @Valor_Retorno
END
GO
Otro ejemplo: Averiguar cuantas veces ha sacado un libro de la biblioteca un
usuario en un lapso de tiempo determinado.
CREATE FUNCTION Uso_Biblioteca(@idUsuario INT, @fecha_inicio DAT
ETIME,@fecha_final DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @cantidad_ocasiones INT;
SELECT @cantidad_ocasiones = COUNT(a. idUsuario)
FROM Biblioteca.Sacar_Libro AS a
WHERE a.idUsuario = @
idUsuario AND (fecha_Utilizacion BETWEEN@fecha_inicio AND @fecha
_final);
IF ( @cantidad_ocasiones IS NULL)
SET @cantidad_ocasiones = 0;
RETURN @cantidad_ocasiones;
END
Funciones con Valores de Tabla en Lnea

Este tipo de funcin tiene la misma sintaxis que una funcin escalar, la nica
diferencia es que devuelve tipo de dato TABLE (una tabla compuesta de
registros).
CREATE FUNCTION nombre_funcion ( [parametro1, parametro2,...])
RETURNS TABLE
[WITH ENCRYPTION | WITH SCHEMABINDING]
[AS]
RETURN (consulta_SELECT)
Las funciones que retornan tablas son muy tiles cuando tenemos consultas
con JOINs debido a la que se reduce la complejidad.
Ejemplo:
Consultar todas las salidas de la biblioteca realizadas para un libro especfico.
Usar el cdigo del libro para generar los resultados y mostrar el nombre de la
persona que lo sac, la fecha de salida y de devolucin.
CREATE FUNCTION Salidas_libro(@idlibro VARCHAR(12))
RETURNS TABLE
AS
RETURN(
SELECT Invb.Nombre_Libro, Usu.Nombre_Usuario,
MovB.Fecha_Salida, MobB.Fecha_Devolucion
FROM
tbInventario_Biblioteca AS Invb JOIN tbMovimientos_Biblioteca AS Mov
b ONInvb.IDCLIENTE = MovB.IDCLIENTE
JOIN tbUsuarios AS Usu ON Usu.IdUsuario = MovB.IDUsuario
WHERE Invb.IdLibro = @idLibro)
La funcin anterior devuelve una tabla que representa todos los usuarios que
han sacado de la biblioteca un libro determinado. Ahora es posible realizar
consultas sobre esta tabla, si deseamos saber el total de todas las veces qu
ese ha sacado un libro con cdigo ISBN00000000, podramos hacer la
siguiente consulta:
SELECT Count(Invb.Nombre_Libro) FROM Salidas_libro ('ISBN0000000
0')
Con esa funcin la base de datos de nuestra biblioteca ganar velocidad de
clculo, adems de ahorrar tiempo en el desarrollo de la aplicacin.
.
Funciones con Valores de Tabla y Mltiples Instrucciones

Este tipo de funciones es similar a las funciones de tabla en lnea, pero ahora
incluyen un bloque de sentencias para manipular la informacin antes de
retornar la tabla. Su sintaxis de creacin es la siguiente:
CREATE FUNCTION nombre_funcion ( [parametro1, parmetro2,...])
RETURNS @variable_tabla TABLE (nombre_columna tipo,...)
[WITH ENCRYPTION | WITH SCHEMABINDING]
[AS]
BEGIN
<bloque de instrucciones>
RETURN
END

La anterior definicin parametriza la variable tipo TABLE que retornar la


funcin por lo que debemos especificar cada parmetro y su tipo.
Ejemplo de funcin con Mltiple Instrucciones
Mostrar todos los libros de la biblioteca que tengan fecha de publicacin
posterior la establecida por parmetro, meter en un solo campo los datos del
libro y agregar un atributo que diga la cantidad de das que lleva sin prestarse.
CREATE FUNCTION reporte_libros(@fecha INT)
RETURNS @tbtabla_libros TABLE (
IDLibro INT PRIMARY KEY NOT NULL IDENTITY,
Nombre VARCHAR(200) NOT NULL,
FechaPublicacion DATETIME NOT NULL,
DiasSinPrestar INT NOT NULL)
AS
BEGIN
INSERT @tbtabla_libros
SELECT L.Nombre+'
'+L.Autor,L.FechaPublicacion,DATEDIFF(DAY,L.Fecha_Prestamo,GETDA
TE())
FROM tbLibros AS L
WHERE L.FechaPublicacion >= @fecha;
RETURN;
END
La funcin anterior inserta filas en una nueva tabla. Antes de escribir el bloque
de instrucciones hemos definido una variable de tipo TABLE con una estructura
de 4 columnas. Esta definicin se parece mucho a la sintaxis CREATE TABLE
para crear tablas. Y al final insertamos los datos con el formato solicitado. Si

ahora queremos ver los registros que tiene la tabla retornada por la funcin,
solo realizamos una consulta de la siguiente forma.
SELECT * FROM reporte_libros(1000);
Clusula ENCRYPTION
Indica que el Motor de base de datos convertir el texto original de la
instruccin CREATE FUNCTION a un formato encriptado. La salida de los
datos encriptados no ser visible en ninguna de las vistas de catlogo. Los
usuarios que no dispongan de acceso a las tablas del sistema o a los archivos
de base de datos no podrn recuperar el texto protegido. Sin embargo, estar
disponible para los usuarios con privilegios que puedan obtener acceso a las
tablas del sistema
Clusula SCHEMABINDING
Especifica que la funcin est enlazada a los objetos de base de datos a los que hace
referencia. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar
de una forma que afecte a la definicin de la funcin. En primer lugar, se debe modificar o
quitar la propia definicin de la funcin para quitar las dependencias en el objeto que se va a
modificar.

Esto significa que las funciones no pueden alterar ni borrar ningn objeto en la
base de datos de la cual dependan, lo que provee seguridad a la informacin.
Por ejemplo, si una funcin intenta alterar los registros de la tabla tbLibros,
SCHEMABINDING evitara esa alteracin, ya que est dentro del esquema del
cual depende la funcin en la base de datos.
Modificar una funcin en SQL Server
Para modificar una funcin basta con sustituir CREATE FUNCTION por ALTER
FUNCTION y redefinir las instrucciones que se encuentran dentro de la funcin.
Este comando te permite cambiar absolutamente toda la sintaxis de la funcin
siempre que nos refiramos a ella con su mismo nombre original.
Borrar una funcin en SQL Server
Elimina una funcin con la sentencia DROP.
DROP FUNCTION reporte_libros;