10.05.2013 Views

universidad don bosco facultad de estudios tecnologicos escuela de ...

universidad don bosco facultad de estudios tecnologicos escuela de ...

universidad don bosco facultad de estudios tecnologicos escuela de ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CICLO 01-2012<br />

I. Objetivos<br />

UNIVERSIDAD DON BOSCO<br />

FACULTAD DE ESTUDIOS TECNOLOGICOS<br />

ESCUELA DE COMPUTACION<br />

GUIA DE LABORATORIO Nº 6<br />

Nombre <strong>de</strong> la practica: Funciones <strong>de</strong> Transact SQL<br />

Lugar <strong>de</strong> ejecución: Laboratorio <strong>de</strong> Informática<br />

Tiempo estimado: 2:30 horas<br />

Materia: Base <strong>de</strong> datos I<br />

Qué el estudiante:<br />

• Utilice las funciones que trae integradas el SQL Server 2008<br />

• Cree Funciones propias en Transact SQL<br />

II. Introducción Teórica<br />

Funciones Transact Sql<br />

SQL Server pone a nuestra disposición multitud <strong>de</strong> funciones pre<strong>de</strong>finidas que proporcionan un amplio<br />

abanico <strong>de</strong> posibilida<strong>de</strong>s, así como la posibilidad <strong>de</strong> que el usuario cree sus propias funciones.<br />

Funciones <strong>de</strong>terminista y no <strong>de</strong>terminista<br />

Las funciones <strong>de</strong>terministas <strong>de</strong>vuelven el mismo resultado cada vez que se llaman con un conjunto<br />

específico <strong>de</strong> valores <strong>de</strong> entrada y cuando el estado <strong>de</strong> la base <strong>de</strong> datos es el mismo. Las funciones no<br />

<strong>de</strong>terministas pue<strong>de</strong>n <strong>de</strong>volver resultados diferentes cada vez que se llaman con un conjunto específico <strong>de</strong><br />

valores <strong>de</strong> entrada aunque el estado <strong>de</strong> la base <strong>de</strong> datos a la que tienen acceso permanezca sin cambios.<br />

Las funciones integradas son <strong>de</strong>terministas o no <strong>de</strong>terministas según el modo en que SQL Server<br />

implementa cada función. Todas las funciones integradas <strong>de</strong> ca<strong>de</strong>na y <strong>de</strong> agregados son <strong>de</strong>terministas.<br />

Las siguientes funciones integradas proce<strong>de</strong>ntes <strong>de</strong> categorías que no son <strong>de</strong> agregados ni <strong>de</strong> ca<strong>de</strong>na<br />

siempre son <strong>de</strong>terministas.<br />

ABS DATEDIFF POWER<br />

ACOS DAY RADIANS<br />

ASIN DEGREES ROUND<br />

ATAN EXP SIGN<br />

ATN2 FLOOR SIN<br />

CEILING ISNULL SQUARE<br />

COALESCE ISNUMERIC SQRT<br />

COS LOG TAN<br />

COT LOG10 YEAR<br />

DATALENGTH MONTH<br />

DATEADD NULLIF<br />

1


Ejemplos<br />

ABS<br />

Función matemática que <strong>de</strong>vuelve el valor absoluto positivo <strong>de</strong> una expresión numérica específica.<br />

ABS ( numeric_expression )<br />

SQRT<br />

Devuelve la raíz cuadrada <strong>de</strong>l valor <strong>de</strong> tipo flotante especificado.<br />

SQRT ( float_expression )<br />

Otras funciones <strong>de</strong> SQL Server<br />

Función Descripción<br />

ROUND Re<strong>don</strong><strong>de</strong>a un valor a la longitud y precisión indicadas.<br />

CAST y CONVERT Convierten <strong>de</strong> un tipo <strong>de</strong> datos a otro <strong>de</strong> forma explícita.<br />

CASE Evalúa una lista <strong>de</strong> condiciones.<br />

ISNULL Reemplaza el valor NULL por otro especificado.<br />

COALESCE Devuelve la primera expresión distinta <strong>de</strong> NULL entre sus argumentos.<br />

Cast y Convert<br />

Convierten una expresión <strong>de</strong> un tipo <strong>de</strong> datos en otro <strong>de</strong> forma explícita. CAST y CONVERT proporcionan<br />

funciones similares.<br />

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )<br />

Don<strong>de</strong>:<br />

data_type, es el tipo <strong>de</strong> <strong>de</strong>stino al que queremos convertir la expresion<br />

expresion, la expresion que queremos convertir<br />

style, parametro opcional que especifica el formato que tiene expresion. Por ejemplo, si queremos<br />

convertir un varchar a datetime, aqui <strong>de</strong>bemos especificar el formato <strong>de</strong> la fecha (el tipo varchar).<br />

A continuación mostramos la tabla <strong>de</strong> códigos <strong>de</strong> estilo (obtenida <strong>de</strong> MicroSoft).<br />

Sin el siglo<br />

(aa) ( 1 Con el siglo<br />

Estándar Entrada/salida (<br />

) ?(aaaa)<br />

3 )<br />

- 0 o 100 ( 1, 2 ) Valor pre<strong>de</strong>terminado mes dd aaaa hh:mia.m. (o p. m.)<br />

1 101 EE.UU. mm/dd/aaaa<br />

2 102 ANSI aa.mm.dd<br />

3 103 Británico/Francés dd/mm/aa<br />

4 104 Alemán dd.mm.aa<br />

5 105 Italiano dd-mm-aa<br />

6 106 (1) - dd mes aa<br />

7 107 (1) - Mes dd, aa<br />

2


Isnull<br />

8 108 - hh:mi:ss<br />

- 9 o 109 ( 1, 2 ) Valor pre<strong>de</strong>terminado + mes dd aaaa hh:mi:ss:mmma.m.<br />

milisegundos<br />

(o p. m.)<br />

10 110 EE.UU. mm-dd-aa<br />

11 111 JAPÓN aa/mm/dd<br />

12 112 ISO aammdd<br />

- 13 o 113 ( 1, 2 ) Europeo pre<strong>de</strong>terminado +<br />

dd mes aaaa<br />

milisegundos<br />

hh:mi:ss:mmm(24h)<br />

14 114 - hh:mi:ss:mmm(24h)<br />

- 20 o 120 ( 2 ) ODBC canónico aaaa-mm-dd hh:mi:ss(24h)<br />

- 21 o 121 ( 2 ) ODBC canónico (con<br />

aaaa-mm-dd<br />

milisegundos)<br />

hh:mi:ss.mmm(24h)<br />

- 126 ( 4 ) ISO8601 aaaa-mm-ddThh:mi:ss.mmm (sin<br />

espacios)<br />

127( 6, 7 ) ISO8601 con zona horaria Z. aaaa-mm-ddThh:mi:ss.mmmZ<br />

(sin espacios)<br />

- 130 ( 1, 2 ) Hijri ( 5 ) dd mes aaaa hh:mi:ss:mmma.m.<br />

- 131 ( 2 ) Hijri ( 5 ) dd/mm/aa hh:mi:ss:mmma.m.<br />

Evalúa una expresión <strong>de</strong> entrado y si esta es NULL, reemplaza NULL con el valor <strong>de</strong> reemplazo especificado.<br />

El valor <strong>de</strong> reemplazo <strong>de</strong>be ser <strong>de</strong>l mismo tipo <strong>de</strong> datos que la expresión a evaluar.<br />

ISNULL ( expression , replacement_value )<br />

COALESCE<br />

Devuelve la primera expresión distinta <strong>de</strong> NULL entre sus argumentos. Un aspecto a tener en cuenta es que<br />

todos los argumentos <strong>de</strong>ben ser <strong>de</strong>l mismo tipo.<br />

COALESCE ( expression [ ,...n ] )<br />

¿Qué valor <strong>de</strong>vuelve?<br />

GetDate y GetUTCDate<br />

GetDate <strong>de</strong>vuelve la fecha y hora actuales <strong>de</strong>l sistema en el formato interno estándar <strong>de</strong> SQL Server 2005<br />

para los valores datetime.<br />

GetUTCDate <strong>de</strong>vuelve el valor datetime que representa la hora UTC (hora universal coordinada u hora <strong>de</strong>l<br />

meridiano <strong>de</strong> Greenwich) actual.<br />

Funciones <strong>de</strong>finidas por el usuario<br />

SQL Server proporciona al usuario la posibilidad <strong>de</strong> <strong>de</strong>finir sus propias funciones, conocidad como UDF<br />

(user <strong>de</strong>fined functions). Exisiten tres tipos <strong>de</strong> funciones. Estas son:<br />

Funciones escalares.<br />

Funciones en línea.<br />

Funciones en línea <strong>de</strong> multiples sentencias<br />

3


Funciones escalares<br />

Las funciones escalares <strong>de</strong>vuelven un único valor <strong>de</strong> cualquier tipo <strong>de</strong> los datos tal como int, money,<br />

varchar, real, etc.<br />

La sintaxis para una función escalar es la siguiente:<br />

CREATE FUNCTION <br />

(<br />

-- Lista <strong>de</strong> parámetros<br />

, ...<br />

)<br />

-- Tipo <strong>de</strong> datos que <strong>de</strong>vuelve la función.<br />

RETURNS <br />

AS<br />

BEGIN<br />

...<br />

END<br />

III. Requerimientos<br />

• Microsoft SQL Server 2008 R2<br />

• Guía Número 6<br />

IV. Procedimiento<br />

Parte 1: Iniciando sesión <strong>de</strong>s<strong>de</strong> SQL Server Managment Studio<br />

1. Hacer clic en el botón Inicio<br />

2. Hacer clic en la opción Todos los programas y hacer clic en Microsoft SQL Server 2008 R2<br />

3. Cargue SQL Server 2008 R2.<br />

Para conectarse con el servidor <strong>de</strong> base <strong>de</strong> datos elija los siguientes parámetros <strong>de</strong> autenticación:<br />

Tipo <strong>de</strong> servidor: Database Engine<br />

Nombre <strong>de</strong>l servidor: SALA02-PCNumMaquina<br />

Nota: NumMaquina es el numero <strong>de</strong> maquina local<br />

Autenticación: SQL Server Authentication<br />

Login: sa<br />

Password: 123456<br />

4. Luego <strong>de</strong> clic en el botón conectar y asi ingresar a la ventana <strong>de</strong>l SQL Server Managment<br />

Studio.<br />

5. Luego seleccionara <strong>de</strong>l menú estándar la opción (Nueva Consulta/New Query) para<br />

empezar a trabajar con las sentencia <strong>de</strong> T-SQL.<br />

6. Localice el icono <strong>de</strong> guardar, con el fin <strong>de</strong> guardar el nuevo archivo <strong>de</strong> sentencias T-SQL<br />

(SQLQuery1.sql). En el asistente para guardar archivo, cree una carpeta llamada<br />

Practica6_BDD en el escritorio (ahí se ira guardando todos los scripts <strong>de</strong>l procedimiento<br />

restante).<br />

Parte 2: Funciones Transact Sql<br />

Digite los siguientes ejemplos y conteste a las preguntas que se hacen en algunos <strong>de</strong> los casos presentados.<br />

4


Ejemplos<br />

1. ABS<br />

SELECT ABS(-1.0), ABS(0.0), ABS(1.0)<br />

¿Cuál es el resultado?<br />

2. SQRT<br />

En el ejemplo siguiente se <strong>de</strong>vuelve la raíz cuadrada <strong>de</strong> los números comprendidos entre 1.00 y 10.00.<br />

DECLARE @myvalue float;<br />

SET @myvalue = 1.00;<br />

WHILE @myvalue < 10.00<br />

BEGIN<br />

SELECT SQRT(@myvalue);<br />

SET @myvalue = @myvalue + 1<br />

END;<br />

GO<br />

3. Cast y Convert<br />

DECLARE @fecha varchar(20)<br />

-- Convertimos un valor varchar a datetime<br />

-- El 103 indica el formato en el que esta escrita la fecha<br />

-- 103 => dd/mm/aa<br />

SET @fecha = CONVERT(datetime, '19/03/2008',103)<br />

SELECT @fecha<br />

Escriba lo que ve en el resultado:<br />

DECLARE @fecha datetime,<br />

@fechaFormateada varchar(20)<br />

-- Convertimos ahora una fecha a varchar y la formateamos<br />

-- 3 => dd/mm/aa<br />

SET @fecha = GETDATE()<br />

SET @fechaFormateada = CONVERT (varchar(20), @fecha, 3)<br />

SELECT @fecha,@fechaFormateada<br />

Explique qué suce<strong>de</strong> cuando se muestra el valor que contienen las dos variables:<br />

-- Un ejemplo utilizando CAST<br />

DECLARE @dato varchar(2),<br />

@dato2 int<br />

SET @dato = '27'<br />

SET @dato2 = cast(@dato AS int)<br />

SELECT @dato2<br />

¿A qué tipo <strong>de</strong> dato fue convertido el valor que contiene la variable @dato?<br />

5


4. IsNull<br />

DECLARE @datoInt int,<br />

@datoVarchar varchar(100)<br />

SET @datoInt = NULL<br />

SET @datoVarchar = NULL<br />

SELECT ISNULL(@dato, -1),<br />

ISNULL(@datoVarchar, 'No hay dato')<br />

5. COALESCE<br />

DECLARE @dato1 int,<br />

@dato2 int,<br />

@dato3 int,<br />

@dato4 int,<br />

@dato5 int<br />

SET @dato1 = null<br />

SET @dato2 = NULL<br />

SET @dato3 = NULL<br />

SET @dato4 = 100<br />

SET @dato5 = 125<br />

SELECT COALESCE(@dato1,@dato2,@dato3,@dato4,@dato5)<br />

GetDate y GetUTCDate<br />

DECLARE @fechaLocal datetime,<br />

@fechaUTC datetime<br />

SET @fechaLocal = getdate()<br />

SET @fechaUTC = GETUTCDATE()<br />

SELECT @fechaLocal, @fechaUTC<br />

Anote los valores que se muestran en las dos variables.<br />

6. El siguiente ejemplo muestra cómo crear una función escalar.<br />

Nota: para po<strong>de</strong>r probar el funcionamiento <strong>de</strong> la función cree una base <strong>de</strong> datos prueba, que<br />

contendrá la tabla llamada CUENTAS y con los campos siguientes: SALDO <strong>de</strong>cimal (10,2),<br />

NUMCUENTA <strong>de</strong>cimal(10,2) y FXALTA char(2).<br />

Ingrese datos a la tabla CUENTAS para luego realizar pruebas.<br />

CREATE FUNCTION fn_MultiplicaSaldo<br />

(<br />

@NumCuenta VARCHAR(20),<br />

@Multiplicador DECIMAL(10,2)<br />

)<br />

RETURNS DECIMAL(10,2)<br />

AS<br />

BEGIN<br />

DECLARE @Saldo DECIMAL(10,2),<br />

6


@Return DECIMAL(10,2)<br />

SELECT @Saldo = SALDO<br />

FROM CUENTAS<br />

WHERE NUMCUENTA = @NumCuenta<br />

SET @Return = @Saldo * @Multiplicador<br />

RETURN @Return<br />

END<br />

Pue<strong>de</strong>n ser utilizadas en cualquier sentencia Transact SQL. Un aspecto a tener en cuenta, es que para<br />

utilizar una función escalar <strong>de</strong>bemos i<strong>de</strong>ntificar el nombre <strong>de</strong> la función con el propietario <strong>de</strong> la misma.<br />

7. El siguiente ejemplo muestra cómo utilizar la función anteriormente creada en una sentencia<br />

Transact SQL. Un aspecto muy a tener en cuenta es que la función ejecutará sus sentencias SELECT<br />

una vez por cada fila <strong>de</strong>l conjunto <strong>de</strong> resultados <strong>de</strong>vuelto por la consulta SELECT principal.<br />

SELECT IDCUENTA,<br />

NUMCUENTA,<br />

SALDO,<br />

FXALTA,<br />

-- Ejecucion <strong>de</strong> la funcion:<br />

dbo.fn_MultiplicaSaldo( NUMCUENTA, IDCUENTA) AS RESULTADO<br />

FROM CUENTAS<br />

8. El siguiente ejemplo muestra cómo utilizar una función escalar en un script Transact SQL.<br />

DECLARE @NumCuenta VARCHAR(20),<br />

@Resultado DECIMAL(10,2)<br />

SET @NumCuenta = '200700000001' --(Sustituya por valores valor<br />

válido que ud.ud. ---ingreso antetiormente)<br />

SET @Resultado = dbo.fn_MultiplicaSaldo(@NumCuenta, 30.5)<br />

PRINT @Resultado<br />

V. Análisis <strong>de</strong> resultados<br />

Teniendo los datos siguientes, asigne los valores a variables como se indica:<br />

o Salario <strong>de</strong>l empleado. Salario <strong>de</strong> tipo varchar (10)=’22.18’<br />

o Horas trabajadas por el empleado Horas varchar(6)=’38.50’<br />

o Con los datos <strong>de</strong>l salario y las horas trabajadas calcular el pago <strong>de</strong> la semana <strong>de</strong>l empleado<br />

y será guardad en una variable llamada salariosemana <strong>de</strong> tipo <strong>de</strong>cimal (6,2). El cálculo lo<br />

hará <strong>de</strong> la siguientes manera: salariosemana= salario*Horas. Tome en cuenta que para<br />

realizar la operación tiene que hacer conversiones <strong>de</strong> tipos <strong>de</strong> datos.<br />

o Muestre el resultado que tiene la variable salariosemana.<br />

Utilización <strong>de</strong> la función Square, para ello se ha <strong>de</strong>finido lo siguiente:<br />

o Va a <strong>de</strong>clarar tres variables como sigue:<br />

Lado <strong>de</strong>cimal(10,3)=48.126<br />

7


Perimetro <strong>de</strong>cimal(10,3)<br />

Area <strong>de</strong>cimal(10,3)<br />

o Deberá realizar los siguientes cálculos<br />

Perimetro=Lado*4<br />

Area= Lado*Lado<br />

o Una vez realizado los cálculos <strong>de</strong>berá mostrar lo siguiente:<br />

Lado = valor que contiene variable lado<br />

Perimetro = valor que contiene la variable perímetro ya con el cálculo realizado.<br />

Area= valor que tiene la variable área ya con el cálculo realizado.<br />

Recuer<strong>de</strong> que <strong>de</strong>be hacer conversiones <strong>de</strong> datos.<br />

VI. Investigación complementaria<br />

Investigue sobre el uso <strong>de</strong> las funciones <strong>de</strong> agrupación y sumarización en SQL Server, <strong>de</strong>be realizar<br />

ejemplos.<br />

VII. Referencia Bibliográfica<br />

Microsoft SQL Server 2008, Guía Práctica, Francisco Charte Ojeda; Anaya Multimedia.<br />

8

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!