Beruflich Dokumente
Kultur Dokumente
Funciones escalares
Las funciones escalares son aquellas que reciben parámetros 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 función. El cuerpo de una función
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 código 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 ANDstrNombre
= @nombre AND strTipo = @tipo
SET @Valor_Retorno = @Valor_Intermedio
RETURN @Valor_Retorno
END
GO
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
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 específico.
Usar el código del libro para generar los resultados y mostrar el nombre de la
persona que lo sacó, la fecha de salida y de devolución.
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
Movb ONInvb.IDCLIENTE = MovB.IDCLIENTE
JOIN tbUsuarios AS Usu ON Usu.IdUsuario = MovB.IDUsuario
WHERE Invb.IdLibro = @idLibro)
SELECT Count(Invb.Nombre_Libro) FROM Salidas_libro ('ISBN0000000
0')
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 función 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 definición 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 función,
solo realizamos una consulta de la siguiente forma.
SELECT * FROM reporte_libros(1000);
Cláusula ENCRYPTION
Indica que el Motor de base de datos convertirá el texto original de la
instrucción CREATE FUNCTION a un formato encriptado. La salida de los
datos encriptados no será visible en ninguna de las vistas de catálogo. Los
usuarios que no dispongan de acceso a las tablas del sistema o a los archivos
de base de datos no podrán recuperar el texto protegido. Sin embargo, estará
disponible para los usuarios con privilegios que puedan obtener acceso a las
tablas del sistema
Cláusula SCHEMABINDING
Especifica que la función 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 definición de la función. En primer lugar, se debe modificar o
quitar la propia definición de la función para quitar las dependencias en el objeto que se va a
modificar.
DROP FUNCTION reporte_libros;