Está en la página 1de 4

FUNCIONES DE TRANSACT SQL

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 en lnea.
Funciones en lnea de mltiples sentencias.

FUNCIONES ESCALARES

Las funciones escalares devuelven un nico valor de cualquier tipo de los


datos tal como int, money, varchar, real, etc. Las funciones escalares son muy
similares a procedimientos almacenados con parmetros de salida, pero
estas pueden ser utilizadas en consultas de seleccin y en la clusula where
de las mismas. Las funciones no pueden ejecutar sentencias INSERT o
UPDATE.
La sintaxis para la creacin de una funcin escalar es la siguiente:
CREATE FUNCTION Nombre ( -- Lista de parmetros @Param1
<Data_Type_For_Param1, ...)
-- Tipo de datos que devuelve la funcin.
RETURNS <Function_Data_Type>
AS
BEGIN
...
END

EJEMPLO:

Crear una funcin que multiplique por un monto determinado el saldo de una
cuenta.
CREATE FUNCTION fn_MultiplicaSaldo (@NumCta NCHAR(10), @Multiplicador
DECIMAL(8,2))
RETURNS DECIMAL(8,2)
AS
BEGIN
Ing. Ana Doris M. Barrera Loza

DECLARE @Saldo DECIMAL(8,2), @Return DECIMAL(8,2)


SELECT @Saldo = SALDO
FROM CUENTA WHERE CTA = @NumCta
SET @Return = @Saldo * @Multiplicador
RETURN @Return
END

Pueden ser utilizadas en cualquier sentencia Transact SQL. Un aspecto a tener


en cuenta, es que para utilizar una funcin escalar debemos identificar el
nombre de la funcin con el propietario de la misma.
El siguiente ejemplo muestra cmo utilizar la funcin anteriormente. Un
aspecto muy a tener en cuenta es que la funcin ejecutar sus sentencias
SELECT una vez por cada fila del conjunto de resultados devuelto por la
consulta SELECT principal.

SELECT
CTA, SALDO, dbo.fn_MultiplicaSaldo( '100002', 5) AS RESULTADO
FROM CUENTA
WHERE CTA = '100002'

Otra forma de utilizar la funcin es de la siguiente manera:


DECLARE @NumCuenta NCHAR(10), @Resultado DECIMAL(8,2)
SET @NumCuenta = '100002'
SET @Resultado = dbo.fn_MultiplicaSaldo(@NumCuenta, 5)
PRINT @Resultado

FUNCIONES EN LINEA

Las funciones en lnea son las funciones que devuelven un conjunto de


resultados correspondientes a la ejecucin de una sentencia SELECT.
La sintaxis para una funcin de tabla en lnea es la siguiente:
CREATE FUNCTION Nombre ( -- Lista de parmetros @Param1
<Data_Type_For_Param1, ...)
RETURNS TABLE
AS
RETURN

( -- Sentencia Transact SQL )


EJEMPLO:

Crear una funcin que nos devuelva el detalle de pedido segn el nmero de
pedido indicado.

Ing. Ana Doris M. Barrera Loza

CREATE FUNCTION fn_Detallepedido (@OrderId Int)


RETURNS TABLE
AS
RETURN
( SELECT Orders.OrderId, CustomerId, EmployeeId, OrderDate,
ProductId, UnitPrice, Quantity
FROM [Order Details] INNER JOIN Orders
ON [Order Details].OrderId = Orders.OrderId
WHERE Orders.OrderId = @OrderId )

No podemos utilizar la clusula ORDER BY en la sentencia de una funcin en


lnea.
Para ejecutar la funcin hacemos lo siguiente:
SELECT

* FROM fn_Detallepedido(10248)

Las funciones en lnea pueden utilizarse dentro de joins o querys como si


fueran una tabla normal.
SELECT * FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN fn_Detallepedido(10248) A
ON A.OrderId = Orders.OrderID

FUNCIONES EN LINEA DE MLTIPLES SENTENCIAS

Las funciones en lnea de mltiples sentencias son similares a las funciones


en lnea excepto que el conjunto de resultados que devuelven puede estar
compuesto por la ejecucin de varias consultas SELECT.
La sintaxis para una funcin de tabla de multisentencias es la siguiente:
CREATE FUNCTION Nombre
RETURNS
-- variable de tipo tabla y su estructura @Table_Var TABLE
( Column_1 <Data_Type_For_Column1, Column_2 <Data_Type_For_Column2, )
AS
BEGIN
-- Sentencias que cargan de datos la tabla declarada
RETURN
END

EJEMPLO:

Crear una funcin que nos devuelva el nmero de los 3 ltimos pedidos de los
3 productos con mayor precio unitario.
CREATE FUNCTION fn_DetalleProductos()
Ing. Ana Doris M. Barrera Loza

RETURNS @datos TABLE ( ProdId int, Precio money, Pedido int)


AS
BEGIN
-- Variables necesarias para la lgica de la funcion.
DECLARE @ProdId int, @Precio money
-- Cursor con los 3 productos de mayor precio
DECLARE CPRECIOS CURSOR FOR
SELECT TOP 3 PRODUCTID, UNITPRICE
FROM PRODUCTS
ORDER BY UNITPRICE DESC
OPEN CPRECIOS
FETCH CPRECIOS INTO @ProdId, @Precio
-- Recorremos el cursor
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- Insertamos el producto en la variable de salida
INSERT INTO @datos (ProdId, Precio)
VALUES (@prodid, @precio)
-- Insertamos los tres ltimos pedidos de los productos
INSERT INTO @datos (Pedido)
SELECT TOP 3 ORDERID
FROM [ORDER DETAILS]
WHERE PRODUCTID = @PRODID
ORDER BY ORDERID DESC
-- Vamos al siguiente producto
FETCH CPRECIOS INTO @ProdId, @Precio
END
CLOSE CPRECIOS;
DEALLOCATE CPRECIOS;
RETURN
END

Para ejecutar la funcin:


Select

* from fn_DetalleProductos()

Ing. Ana Doris M. Barrera Loza

También podría gustarte