Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SQL Server proporciona al usuario la posibilidad de definir sus propias funciones, conocidas como UDF (user defined functions). Existen
tres tipos de funciones. Estas son:
Funciones escalares
Funciones con valores de tabla de varias instrucciones y
Funciones con valores de tablas en línea
Luego del nombre se colocan (opcionalmente) los parámetros de entrada con su tipo. La cláusula "returns" indica el tipo de dato
retornado.
El cuerpo de la función, se define en un bloque "begin...end" que contiene las instrucciones que retornan el valor. El tipo del valor
retornado puede ser de cualquier tipo, excepto text, ntext, image, cursor o timestamp.
Creamos una simple función denominada "f_promedio" que recibe 3 valores y retorna el promedio:
Entonces, luego de "create function" y el nombre de la función, se deben especificar los parámetros de entrada con sus tipos de datos
(entre paréntesis), el tipo de dato que retorna luego de "returns", luego de "as" comienza el bloque "begin...end" dentro del cual se
encuentran las instrucciones de procesamiento y el valor retornado luego de "return".
En el ejemplo anterior se declara una variable local a la función (desaparece al salir de la función) que calcula el resultado que se
retornará.
Al hacer referencia a una función escalar, se debe especificar el propietario y el nombre de la función:
Analicemos: luego de "create function" y el nombre de la función, especificamos los parámetros de entrada con sus tipos de datos
(entre paréntesis). El parámetro de entrada tiene definido un valor por defecto.
Luego de los parámetros de entrada se indica el tipo de dato que retorna luego de "returns"; luego de "as" comienza el bloque
"begin...end" dentro del cual se encuentran las instrucciones de procesamiento y el valor retornado luego de "return".
Las funciones que retornan un valor escalar pueden emplearse en cualquier consulta donde se coloca un campo.
Recuerde que al invocar una función escalar, se debe especificar el propietario y el nombre de la función:
No olvide que cuando invocamos funciones que tienen definidos parámetros de entrada DEBEMOS suministrar SIEMPRE un valor para
él.
Podemos colocar un valor por defecto al parámetro, pero al invocar la función, para que tome el valor por defecto DEBEMOS especificar
"default". Por ejemplo, si llamamos a la función anterior sin enviarle un valor:
Select dbo.f_nombreMes();
SQL Server muestra un mensaje de error indicando que necesita argumento.
Para que tome el valor por defecto debemos enviar "default" como argumento(parámetro):
Select dbo.f_nombreMes(default);
La instrucción "create function" debe ser la primera sentencia de un lote. / OTRO EJEMPLO DE FUNCION SQL ESCALAR:
RETURN @Return
END
El siguiente ejemplo muestra como utilizar la función anteriormente creada en una sentencia Transact SQL. Un aspecto muy
a tener en cuenta es que la función ejecutará sus sentencias SELECT una vez por cada fila del conjunto de resultados
devuelto por la consulta SELECT principal.
DECLARE @NumCuentaVARCHAR(20),
@Resultado DECIMAL(10,2)
PRINT @Resultado
Las funciones escalares son muy similares a procedimientos almacenados con parámetros de salida, pero estas pueden ser utilizadas en consultas de
seleccion y en la clausula where de las mismas.
Las funciones no pueden ejecutar sentencias INSERT o UPDATE.
*******
Las funciones escalares son las más parecidas a las funciones que se utilizan dentro de los lenguajes de programación. Se utilizan
básicamente para cálculos básicos matemáticos ya que devuelven un único valor escalar. ejemplo: Calculo del IVA:
-- Creamos la función con el nombre IVA
-- Indicamos el parámetro de entrada y tipo: @cantidad money
Create function fn_IVA (@cantidad money)
Returns money -- Indicamos el tipo de parámetros que retornará la función.
as
-- Encapsulamos el conjunto de instrucciones sql dentro de un Begin y un end.
Begin
-- Dentro de la sentencia o funcion podemos manejar variables
--aunque puede no ser necesario para ser más eficiente la función.
-- por cuestiones de ejemplo usamos la variable @resultado
Declare @resultado money
set @resultado = @cantidad * 0.16
-- Cuando terminamos la función ponemos el Return
Return (@resultado) -- Y la variable que devolverá la función @resultado.
end
Para llamar a la función la llamamos con un nombre de dos partes, con el esquema.funcion mas el parámetro que requiere la
función:
Select producto, unidad, precio, dbo.Fn_iva(precio) as ‘ IVA ‘ from productos
Funciones con valores de tabla de varias instrucciones y
Funciones con valores de tablas en línea
A groso modo y solo para simplificar, son un híbrido entre vista y procedimiento almacenado, ya que suelen ser consultas con
una instrucción select, pero que pueden recibir parámetros, cosa que no puede hacer una vista y si un procedimiento desde la
versión sql server 2008 en adelante. Un procedimiento almacenado es más poderoso, ya que puede encapsular insert, update,
delete o un conjunto de instrucciones SQL… De todas formas si se puede… recomiendo que se trabajes con procedimientos
almacenados en lugar de con funciones, dentro de lo posible... ya que desde sql 2008 se puedes pasar variables tipo tabla
(arrays) a procedimientos almacenados... (http://microsoftsqlsecret.fullblog.com.ar/stored-procedure-with-array-parameters-
como-pasamos-variables-tipo-ta.html)
--Creamos una función que se le ingrese por parámetro el NOMBRE DE UN país y devuelva los
clientes de ese país:
"returns" especifica "table" como el tipo de datos a retornar. No se define el formato de la tabla a retornar
porque queda establecido en el "select".