Sunteți pe pagina 1din 6

UNIVERSIDAD NACIONAL DE INGENIERIA

UNI-NORTE, SEDE ESTELI


CARRERA: INGENIERIA DE SISTEMAS

PRACTICA DE LABORATORIO No. 9


BASE DE DATOS II

Prof. MSc. Ing. Julio Rito Vargas Avils I semestre 2007

CREANDO FUNCIONES DE USUARIO EN SQL-SERVER 2000

Microsoft agreg nuevas caractersticas a su producto SQL 2000, y lo ms


interesante para los programadores del SQL es la posibilidad de hacer funciones
definidas por el usuario. La adicin de funciones al lenguaje del SQL
solucionara los problemas de reutilizacin del cdigo y da mayor flexibilidad al
programar las consultas de SQL.

El servidor 2000 del SQL utiliza tres tipos de funciones: las funciones escalares,
tabla en lnea, funciones de tabla de multisentencias. Los tres tipos de funciones
aceptan parmetros de cualquier tipo excepto el rowversion. Las funciones
escalares devuelven un solo valor, tabla en lnea y Multisentencias devuelven un
tipo de dato tabla.
Funciones Escalares: Las funciones escalares vuelven un tipo de los
datos tal como int, money, varchar, real, etc. Pueden ser utilizadas en
cualquier lugar incluso incorporada dentro de sentencias SQL. La
sintaxis para una funcin escalar es la siguiente:

Los siguientes ejemplos de funciones escalares, los desarrollar desde el


analizador de consulta en la Base de Datos Northwind.

Ejemplo 1: La siguiente funcin escalar recibe un parmetro de tipo flot y


retorna el cubo del valor ingresado como parmetro.

CREATE FUNCTION dbo.Cubo( @fNumber float)


RETURNS float
AS
BEGIN
RETURN(@fNumber * @fNumber * @fNumber)
END

Para ejecutar la funcin use los siguientes datos:

select dbo.Cubo1(4.0)

select dbo.Cubo1(24.0)

select dbo.Cubo1(124.0)
Ejemplo 2: La siguiente funcin escalar recibe un parmetro de tipo int y
retorna el factorial del valor ingresado como parmetro, si el nmero
ingresado en negativo regresa uno (1).

CREATE FUNCTION dbo.Factorial ( @Numero int )


RETURNS INT
AS
BEGIN
DECLARE @i int

IF @Numero <= 1
SET @i = 1
ELSE
SET @i = @Numero * dbo.Factorial(@Numero - 1 )
RETURN (@i)
END

Ejecutar

Select dbo.Factorial(5)

Select dbo.Factorial(8)

Select dbo.Factorial(-6)

Ejemplo 3: La siguiente funcin escalar recibe tres parmetros de tipo


decimal y retorna el volumen.

CREATE FUNCTION dbo.Volume ( @Alto decimal(5,2),


@Largo decimal(5,2), @Ancho decimal(5,2) )
RETURNS decimal (15,4)
AS
BEGIN
RETURN (@Alto * @Largo * @Ancho)
END

Ejecutar

Select dbo.Volume(4, 5.6, 7.8)

Select dbo.Volume(14, 15.8, 34.67)

Ejemplo 4: La siguiente funcin escalar recibe un parmetro de tipo


nvarchar y retorna un valor del mismo tipo. Note que la funcin es llamada
dentro de una consulta Select usando la tabla Employees.
CREATE FUNCTION fn_NewRegion (@myinput nvarchar(30))
RETURNS nvarchar(30)
BEGIN
IF @myinput IS NULL
SET @myinput = 'No Aplicable'
RETURN @myinput
END

Ejecutar:
select EmployeeID,LastName,dbo.fn_NRegion(Region) as Region from
dbo.Employees

Ejemplo 5: La siguiente funcin escalar recibe dos parmetros, uno de tipo


fechahora(datetime) y el otro de tipo char; y retorna un valor de tipo char.

CREATE FUNCTION fn_FormatoFecha(@fechaentrada datetime,


@separator char(1))

RETURNS Nchar(20)
AS
BEGIN
RETURN
CONVERT(Nvarchar(20), datepart(dd, @fechaentrada)) + @separator +
CONVERT(Nvarchar(20), datepart(mm, @fechaentrada)) +
@separator + CONVERT(Nvarchar(20), datepart(yy, @fechaentrada)) END

Ejecutar

SELECT dbo.fn_FormatoFecha(GETDATE(),':')
SELECT dbo. fn_FormatoFecha(GETDATE(),';')

Funciones de tabla en lnea

Las funciones de tabla en lnea son las funciones que devuelven la salida de
una simple declaracin SELECT. La salida se puede utilizar adentro de joins
o querys como si fuera un tabla de estndar. La sintaxis para una funcin de
tabla en lnea es como sigue:

Ejemplo 1: La siguiente funcin permite obtener los registros de autores


por estado de la tabla autores.
USE Pubs
GO

CREATE FUNCTION dbo.AutoresPorEstado(@Estado char(2) )


RETURNS TABLE
AS
RETURN (SELECT * FROM Autores WHERE state = @Estado)

ejecutar

SELECT * FROM dbo.AutoresPorEstado (MD)

SELECT * FROM dbo.AutoresPorEstado (CA)

Ejemplo 2: La siguiente funcin permite obtener los registros de autores por


estado de la tabla autores.

USE Northwind GO

CREATE FUNCTION fn_ClientePorRegion( @RegionParametro


nvarchar(30))

RETURNS table
AS
RETURN (SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = @RegionParametro)

Ejecutar:

SELECT * FROM fn_ClientePorRegion('WA')

Ejemplo 3:

Este ejemplo de una funcin de valores de tabla en lnea:

USE Pubs
GO

CREATE FUNCTION VentasPorTienda (@storeid varchar(30))


RETURNS TABLE
AS
RETURN (SELECT title, qty
FROM sales s, titles t
WHERE s.stor_id = @storeid and
t.title_id = s.title_id)

Para ejecutarla, se utiliza una consulta tal como la siguiente:


SELECT * FROM VentasPorTienda ('6380')
Ves que puedes utilizar la funcin como si fuera una tabla o vista. El optimizador de
consultas procesa una funcin en lnea de la misma manera que una vista,
expandindola como si hubieras ejecutado la consulta entera. Resulta entonces que la
encapsulacin de la SELECT dentro de una funcin en lnea no afecta negativamente el
rendimiento.

Las funciones de tabla de multi sentencias


Son similares a los procedimientos almacenados excepto que vuelven una
tabla. Este tipo de funcin se usa en situaciones donde se requiere ms lgica
y proceso. Lo que sigue es la sintaxis para una funciones de tabla de multi
sentencias:

Ejemplo 1: La siguiente funcin permite mostrar una de dos funciones en


dependencia de un parmetro entrado.

USE Northwind
GO

CREATE FUNCTION fn_Empleados1 (@length nvarchar(20))


RETURNS @fn_Empleados TABLE
(EmployeeID int PRIMARY KEY NOT NULL,
[Employee Name] nvarchar(61) NOT NULL)
AS
BEGIN
IF @length = 'Nombre corto'
INSERT @fn_Empleados SELECT EmployeeID, LastName
FROM Employees
ELSE IF @length = 'Nombre largo'
INSERT @fn_Empleados SELECT EmployeeID,
(FirstName + ' ' + LastName) FROM Employees
RETURN
END
--ejecutar
SELECT * FROM dbo.fn_Empleados1('Nombre corto')
SELECT * FROM dbo.fn_Empleados1('Nombre largo')

Ejemplo 2:

La funcin del ejemplo 1, es posible reescribirla en forma de una funcin de valores de


tabla de mltiples instrucciones:

USE Pubs
GO

CREATE FUNCTION VentasPorTienda1 (@storeid varchar(30))


RETURNS @t TABLE (title varchar(80) NOT NULL,
qty smallint NOT NULL) AS
BEGIN
INSERT @t (title, qty)
SELECT t.title, s.qty
FROM sales s
JOIN titles t ON t.title_id = s.title_id
WHERE s.stor_id = @storeid
RETURN
END

Se ejecuta esta funcin de la misma manera que la funcin en lnea, pero el optimizador
de consultas no expande las funciones de mltiples instrucciones. Puedes decir que este
tipo de funcin es como un procedimiento almacenado dentro de la consulta, que
devuelve sus resultados en una table temporal.

SELECT * FROM VentasPorTienda ('6380')

S-ar putea să vă placă și