Funciones en SQL Server

Como habíamos visto en el articulo de funciones en MySQL, una función es una rutina almacenada que recibe unos parámetros escalares de entrada, luego los procesa según el cuerpo definido de la función y por ultimo retorna en un resultado de un tipo especifico que permitirá cumplir un objetivo.

A diferencia de MySQL  las funciones definidas por el usuario en SQL Server permiten retornar tablas en los resultados . Esta característica brinda al programador facilidad a la hora de administrar sus bases de datos.

Crear funciones en SQL Server




Que tipos de funciones definidas por el usuario existen en SQL Server?

Existen 3 tipos:
Funciones escalares
Funciones con valores de tabla en linea 
Funciones con valores de tabla y múltiples instrucciones

La sintaxis de creación de las tres es muy similar, solo se diferencian en el tipo de parámetros que retornan.

Que es una función escalar?

Es aquella que recibe parámetros de entrada para ser procesados y al final retornar en un tipo de dato sencillo. Cuando hablo de sencillo me refiero a tipos de datos elementales como INT, FLOAT, VARCHAR, etc.

SQL Server no permite que las funciones escalares retornen en los tipos text, ntext, image, cursor y timestamp. Al igual que MySQL, usaremos la palabra reservada RETURNS para indicar el tipo de dato en el cual retornará la función. El cuerpo de una función escalar esta contenido en un bloque de instrucciones como en los procedimientos.

Veamos la sintaxis de creación:

CREATE FUNCTION nombre_función ( [parámetro1, parámetro2,...])
RETURNS tipo_de_dato
[WITH ENCRYPTION | WITH SCHEMABINDING]
[AS]
BEGIN<bloque_de_instrucciones>
RETURN valor_retornado
END

De la definición anterior ya conocemos el uso de la propiedad WITH ENCRYPTION vista en la creación de procedimientos en SQL Server. Mas adelante veremos para que es WITH SCHEMABINDING.

Puedes darme un ejemplo de funciones escalares porfis?

Claro! A continuación veremos un enunciado que debe ser solucionado con la creación de una función escalar. El problema esta basado en una base de datos de una Aerolínea. Observa:

Averigüe cuantas veces ha viajado un pasajero en un lapso de tiempo. Use la identificación del pasajero para consultar dicha información. En cuanto al lapso de tiempo, especifique una fecha de inicio y una fecha final.

CREATE FUNCTION cuanto_ha_viajado(@idpasajero INT, @fecha_inicio DATE , @fecha_final DATE)
RETURNS INT
AS
BEGIN
DECLARE @cantidad_ocasiones INT;
SELECT @cantidad_ocasiones = COUNT(a.idpasajero)
FROM Aerolinea.Boleto AS a
WHERE a.idpasajero = @idpasajero AND (fecha_compra BETWEEN @fecha_inicio AND @fecha_final);
IF ( @cantidad_ocasiones IS NULL)
SET @cantidad_ocasiones = 0;
RETURN @cantidad_ocasiones;
END

Que es una función con valores de tabla en linea?

Este tipo de función tiene la misma sintaxis que una función escalar, la única diferencia está en que retorna un tipo de dato TABLE, es decir, una tabla compuesta de registros. Veamos la variación de la sintaxis:

CREATE FUNCTION nombre_función ( [parámetro1, parámetro2,...])
RETURNS TABLE
[WITH ENCRYPTION | WITH SCHEMABINDING]
[AS]
RETURN (consulta_SELECT)

Las funciones que retornan tablas son muy útiles cuando tenemos consultas que tengan JOINS debido a la reducción de complejidad.

Miramos un ejemplo de una función con valores de tabla en línea?

Por supuesto!, supón que tenemos una base de datos comercial de una Tienda Digital que vende Hardware. Esta base de datos tiene la famosa relación entre clientes, pedidos y artículos. El requerimiento dice así:

Consulte todas las compras realizadas de un producto específico. Use el código del producto para generar los resultados y  muestre el nombre del cliente que compro ese producto, la fecha en que se compro, el precio que tenia en ese momento y la cantidad comprada.

CREATE FUNCTION ventas_producto(@idproducto INT)
RETURNS TABLE
AS
RETURN(
SELECT C.NOMBRE, F.FECHA, DF.CANTIDAD, DF.PRECIO,P.IDPRODUCTO
FROM
CLIENTE AS C JOIN FACTURA AS F ON C.IDCLIENTE = F.IDCLIENTE
JOIN DETALLEFACTURA AS DF ON DF.IDFACTURA = F.IDFACTURA
JOIN PRODUCTO AS P ON P.IDPRODUCTO = DF.IDPRODUCTO
WHERE P.IDPRODUCTO = @idproducto)

La anterior función retorna en una tabla que representa todas las compras de un producto realizadas hasta el momento por los clientes. Ahora podemos realizar consultas sobre esta tabla, por ejemplo, si quisiéramos sumar el total de todas las ventas del articulo con código 1003, podríamos hacer la siguiente consulta:

SELECT SUM(CANTIDAD*PRECIO) FROM ventas_producto(1003)

Con esa función la base de datos de nuestra tienda virtual de hardware ganará velocidad de cálculo, además de ahorrar tiempo para los desarrolladores y administradores.

Que es una función con valores de tabla y múltiples instrucciones?

Este tipo de funciones son similares a las funciones de tabla en linea, solo que incluyen un bloque de sentencias para manipular la información antes de retornar la tabla. Su sintaxis de creación es la siguiente:

CREATE FUNCTION nombre_función ( [parámetro1, parámetro2,...])
RETURNS @variable_tabla TABLE (nombre_columna tipo,...)
[WITH ENCRYPTION | WITH SCHEMABINDING]
[AS]
BEGIN
<bloque de instrucciones>
RETURN
END

La anterior definición parametriza la variable tipo TABLE en que retornará la función. Es decir, definiremos como será su estructura antes de retornarla. Así que debemos especificar cada parámetro y su tipo.

Este tipo esta mas complicado, me explicas mediante un ejemplo?

Claro!, a continuación veremos un ejemplo sencillo. Fíjate en el siguiente enunciado:

Muestre todos los registros de la tabla EMPLEADO que tengan un salario mayor o igual a un valor establecido como parámetro . Además de ello combine en un solo campo el nombre y apellido del empleado y agregue un nuevo atributo que muestre la cantidad de días que lleva el empleado desde su fecha de ingreso.

CREATE FUNCTION reporte1_empleados(@salarioemp INT)
RETURNS @tabla TABLE (
IDEMPLEADO INT PRIMARY KEY NOT NULL IDENTITY,
NOMBRE VARCHAR(200) NOT NULL,
SALARIO INT NOT NULL,
DIASLABORANDO INT NOT NULL)
AS
BEGIN
INSERT @tabla
SELECT E.NOMBRE+" "+E.APELLIDO,E.SALARIO, DATEDIFF(DAY,E.FECHA_INGRESO,GETDATE())
FROM EMPLEADO AS E
WHERE E.SALARIO >= @salarioemp;
RETURN;
END

Con la anterior función retornamos en una nueva tabla personalizada como lo pedía el enunciado. Nota que antes de escribir el bloque de instrucciones hemos definido una variable 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 que se pidió.
Si queremos ver que registros tiene la tabla retornada por la función, solo realizamos una consulta de la siguiente forma.

SELECT * FROM reporte1_empleados(1000);

Que es eso de SCHEMABINDING?

Esta restricción permite enlazar la función a un esquema de la base de datos, ya sea una tabla, vista, otras funciones, etc. Significa que todas la función no puede alterar ni borrar ningún objeto en la base de datos de la cual dependa, lo que provee seguridad a la información.

Por ejemplo, si una función quisiera alterar los registros de la tabla EMPLEADO, SCHEMABINDING evitaría que eso pasase, ya que esta dentro del esquema del cual depende la función en la base de datos.

A todas estas, como modifico una función?

Muy fácil!, con ALTER FUNCTION. Este comando te permite cambiar absolutamente toda la sintaxis de la función. Veamos como modificamos un función escalar que antes tomaba dos números para una suma y ahora deseamos que tome tres parámetros. Además queremos que proteja el esquema de la base de datos.

ALTER FUNCTION suma ( @a int, @b INT, @c INT)
RETURNS INT
WITH SCHEMABINDING
BEGIN
RETURN @a+@b+@c;
END;

Sabroso!, y como borro una función?

Con la famosa sentencia DROP. Mira como borramos una función que pronostica la cantidad de huéspedes futuros de un Hotel.

DROP FUNCTION pronostico_anual_huespedes;

James Revelo Urrea - Desarrollador independiente http://www.hermosaprogramacion.com

Fuente: este post proviene de Hermosa Programación, donde puedes consultar el contenido original.
¿Vulnera este post tus derechos? Pincha aquí.
Modificado:
¿Qué te ha parecido esta idea?

Esta idea proviene de:

Y estas son sus últimas ideas publicadas:

Recomendamos

Relacionado

informática bases de datos cursor ...

Un cursor es un objeto que te permite leer fila por fila los resultados que arroja una consulta. Lo que significa que ahora podremos ejecutar bloques de instrucciones que se relacionen individualmente con cada registro. A lo largo de este artículo estudiaremos los pasos necesarios para usar un cursor sobre una consulta. Veremos como usar el bucle WHILE para leer completamente la información y fina ...

informática bases de datos funciones ...

Una función en MySQL es una rutina creada para tomar unos parámetros, procesarlos y retornar en un salida. Se diferencian de los procedimientos en las siguientes características: Solamente pueden tener parámetros de entrada IN y no parámetros de salida OUT o INOUT Deben retornar en un valor con algún tipo de dato definido Pueden usarse en el contexto de una sentencia SQL Solo retornan un valor in ...

informática bases de datos ejemplos ...

Como ya habíamos visto en el artículo sobre Triggers en MySQL, un Trigger es una rutina especial que se ejecuta automáticamente cuando surgen eventos DML en nuestras tablas. Quiere decir que no podemos ejecutarlos explícitamente como a los procedimientos o funciones, si no que lo dejamos en manos del gestor de bases de datos. Recuerda que los eventos DML surgen al usar las sentencias INSERT, UPDAT ...

informática bases de datos c# ...

Conectar nuestras aplicaciones C# a una base de datos en SQL Server es uno de los requerimientos mas importantes de funcionalidad en nuestros proyectos. Por eso hoy aprenderemos una forma de realizar esta conexión y veremos ejemplos que nos guíen a través de todo el articulo. En primera instancia verás como abrir la conexión al servidor, luego aprenderás a ejecutar comandos , también a mostrar los ...

Tecnología linux Microsoft ...

Normalmente siempre estamos informando sobre el mundo de los Smartphones, pero esta noticia que acabamos de conocer es todo un acontecimiento en la industria de la tecnología. A través del blog oficial de Microsoft la compañía anuncio que SQL Server estará disponible para Linux. SQL Server es un software para base de datos ampliamente utilizado por las empresas alrededor del mundo, sin embargo, es ...

informática desarrollo android

En este tutorial descubriremos como usar bases de datos en SQLite para no perder la información de nuestras Aplicaciones Android. A medida que vayamos avanzando veremos la utilidad de clases como SQLiteOpenHelper, SQLiteDatabase, Cursor, CursorAdapter y de Herramientas como sqlite3 y SQLite Browser. Asumimos que tienes conocimientos básicos en SQLite Con el fin de facilitar tu aprendizaje usarem ...

informática desarrollo android

En este tutorial descubriremos como usar bases de datos en SQLite para no perder la información de nuestras Aplicaciones Android. A medida que vayamos avanzando veremos la utilidad de clases como SQLiteOpenHelper, SQLiteDatabase, Cursor, CursorAdapter y de Herramientas como sqlite3 y SQLite Browser. Asumimos que tienes conocimientos básicos en SQLite Con el fin de facilitar tu aprendizaje usarem ...

informática desarrollo android

¿Andas buscando como parsear un archivo RSS con formato XML, para incluir contenidos de un sitio web en tu aplicación Android? ¿Necesitas ideas para crear una app lectora de Rss como Feedly, Flipboard o Flyne? Pues bien, en este tutorial verás cómo alimentar una lista de elementos con las noticias del sitio web forbes.com desde su feed con formato RSS a través de las tecnologías Volley y Simple Fr ...

informática bases de datos ejemplos ...

Un Trigger en MySQL es un programa almacenado(stored program), creado para ejecutarse automaticamente cuando ocurra un evento en nuestra base de datos. Dichos eventos son generados por los comandos INSERT, UPDATE y DELETE, los cuales hacen parte del DML(Data Modeling Languaje) de SQL. Esto significa que invocaremos nuestros Triggers para ejecutar un bloque de instrucciones que proteja, restrinja ...

informática bases de datos mysql ...

En este artículo veremos como integrar Php y Mysql para aumentar la funcionalidad de nuestros desarrollos web. Primero veremos como abrir la conexión en el servidor Mysql. Luego ejecutaremos comandos en nuestra base de datos a través de nuestra aplicación y finalmente aprenderemos a llamar procedimientos almacenados. Actualmente Php ha declarado obsoleta su API clásica de conexión MySQL para proye ...