Microsoft Word - Manual SQL Server 2000 - 2
Microsoft Word - Manual SQL Server 2000 - 2
Microsoft Word - Manual SQL Server 2000 - 2
EJEMPLO: Esto se puede utilizar tambin para inicializar variables. Es el mismo caso pero utilizando el CASE para inicializar una variable.
DECLARE @N INT,@TIPO CHAR(10),@VALOR CHAR(11) SET @N = 1 WHILE (@N < 100) BEGIN IF (@N < 50) SET @VALOR = 'MENOR DE 50' ELSE SET @VALOR = 'MAYOR DE 50' SET @TIPO = CASE (@N % 2) WHEN 1 THEN 'IMPAR' ELSE 'PAR' END SELECT @N AS 'NUMERO', @TIPO AS 'TIPO',@VALOR AS VALOR SET @N = @N + 1 END
50
CONVERT se usa para convertir el numero a una cadena de dos caracteres y lo concatenamos con @tipo. CAST realiza lo mismo que CONVERT
DECLARE @N INT,@TIPO CHAR(10) SET @N = 5 IF (@N BETWEEN 4 AND 6) BEGIN WHILE (@N > 0) BEGIN SET @TIPO = CASE (@N % 2) WHEN 1 THEN 'IMPAR' ELSE 'PAR' END SELECT @N AS 'NUMERO', @TIPO AS 'TIPO' PRINT CONVERT (CHAR(2),@N) + @TIPO PRINT CAST (@N AS CHAR(2)) + @TIPO SET @N = @N - 1 END END
Ponemos Cast y Convert para poder concatenar un valor de tipo Int con un valor de tipo Char, sino intentara sumarlos y dara error.
51
EJERCICIOS CON SENTENCIAS 1. Queremos saber a qu empleados eliminariamos si quitasemos los departamentos 10 y 30 y cales se mantendran. Mostrar un informe con el apellido, salario, oficio y fechas de alta en la empresa. select apellido,salario,dept_no,oficio,'Accion' = case when dept_no <> 10 then 'Empleado de baja' else 'Se Mantiene' end from emp where oficio = 'empleado' 2. Debemos hacer recortes de salario en la empresa, para ello debemos saber a que personas recortaremos el sueldo, cuales se mantendrn y cuales subiremos el puesto. Utilizar todos los empleados de la empresa(Plantilla y Empleados) Cuando el salario sea menor de 100000, Subiremos sueldo, cuando est entre 100000 y 250000 lo mantendremos y cuando sea superior, lo bajaremos. select Apellido, Salario, 'Accion' = case when salario < 100000 then 'Subir sueldo' when salario between 150000 and 250000 then 'Mantener sueldo' else 'Bajar sueldo' end from emp union select apellido,salario, 'Accion' = case when salario < 100000 then 'Subir sueldo' when salario between 150000 and 250000 then 'Mantener sueldo' else 'Bajar sueldo' end from plantilla 3. Queremos saber que empleados de la plantilla trabajan en turno de tarde, noche o en otros, para ello mostraremos Tarde o Noche dependiendo de sus valores. select 'Nmero empleado' = empleado_no, 'Apellido' = apellido, 'Turno' = case t when 'T' then 'Tarde' when 'm' then 'Maana' else 'Otros' end from plantilla
52
4. Queremos cambiar de localidad en Barcelona, para ello tenemos que saber qu empleados cambiarian de localidad y cales no. Combinar tablas y mostrar el nombre del departamento junto a los datos del empleado. select d.dnombre as [Departamento] ,e.apellido,'Cambiar de Localidad' = case when d.loc = 'SEVILLA' THEN 'CAMBIA DE LOCALIDAD' else 'NO CAMBIA DE LOCALIDAD' end from emp as e inner join dept as d on e.dept_no = d.dept_no 5. Queremos saber el nmero de trabajadores que cambiaran de localidad si cambiasemos a Barcelona y que nmero de trabajadores no cambiarian de localidad. select count(e.emp_no) as [N de trabajadores], d.loc as [Ciudad],'Cambiar' = case when d.loc = BARCELONA THEN 'CAMBIA DE LOCALIDAD' else 'no cambia' end from emp as e inner join dept as d on d.dept_no = e.dept_no group by d.loc 6. Mostrar el apellido, la direccin, la fecha de nacimiento mostrando la dcada en la que est cada persona y el sexo mostrando si es masculino o femenino de la tabla enfermo. SELECT APELLIDO, DIRECCION, [FECHA NACIMIENTO] = CASE WHEN FECHA_NAC BETWEEN '01/01/1940' AND '01/01/1950' THEN 'DECADA DE LOS 40' WHEN FECHA_NAC BETWEEN '01/01/1950' AND '01/01/1960' THEN 'DECADA DE LOS 50' WHEN FECHA_NAC BETWEEN '01/01/1960' AND '01/01/1970' THEN 'DECADA DE LOS 60' WHEN FECHA_NAC BETWEEN '01/01/1970' AND '01/01/1980' THEN 'DECADA DE LOS 70' WHEN FECHA_NAC BETWEEN '01/01/1980' AND '01/01/1990' THEN 'DECADA DE LOS 80' ELSE 'DEMASIADO VIEJO O DEMASIADO JOVEN' END ,SEXO = CASE S WHEN 'F' THEN 'MUJER'
53
ELSE 'HOMBRE' END FROM ENFERMO ORDER BY FECHA_NAC,S 7. Mostrar el apellido, el salario, el oficio y el nombre del departamento de todos los empleados aunque no tengan departamento. Si no tienen departamento mostrar que no tienen departamento. Mostrar adems si tienen comisin o si no tienen comisin. select e.apellido,e.oficio,e.salario ,DEPARTAMENTO = ISNULL(d.dnombre,'SIN DEPARTAMENTO') ,Comision = case Comision when 0 then 'SIN COMISION' else 'CON COMISION' end from emp e LEFT JOIN DEPT d ON E.DEPT_NO = D.DEPT_NO order by d.dnombre 8. Mostrar todas las camas que existen para cada hospital y cada sala. Mostrar el nombre del hospital, las salas y su nmero de camas. Si no hubiese camas para algn hospital las dejar a 0. Tambin mostrar que son muchas camas cuando sean ms de 90, buen nmero cuando sean mayores de 40 y pocas camas para las dems. select h.nombre as [HOSPITAL] ,isnull(s.num_cama,0) as [N DE CAMAS] ,s.nombre as [SALAS] ,CAMAS = CASE when s.num_cama > 90 then 'DEMASIADAS CAMAS' when s.num_cama between 40 and 89 then 'BUEN NUMERO' else 'POCAS CAMAS' end from sala as s full join hospital as h on h.hospital_cod = s.hospital_cod group by h.nombre,s.num_cama,s.nombre order by h.nombre,s.num_cama
54
9. Seleccionar qu empleados estn dentro de la media y cuales estn por debajo de la media, mostrando el apellido, oficio, salario, comisin y el nombre de los departamentos. No dejar ningn campo a NULL. declare @media int select @media = avg(salario) from emp select e.apellido,e.oficio,e.salario,e.comision ,MEDIA = case when salario > @media then 'DENTRO DE LA MEDIA' else 'POR DEBAJO DE LA MEDIA' end ,isnull(d.dnombre,'SIN DEPARTAMENTO') from emp as e left join dept d on e.dept_no = d.dept_no group by e.apellido,e.oficio,e.salario,e.comision,d.dnombre order by Media
55
INSERCIN, ELIMINACIN Y MODIFICACIN DE DATOS Insercin de una fila mediante valores: INSERT INTO {NombreTabla | NombreVista} [Valor de la Columna] VALUES Valores * Cuando hay llaves es porque se debe elegir entre uno de los dos, esta barra | indica que se debe poner uno de los dos valores. Uso INSERT...SELECT: INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE CondicionBusqueda Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos. La consulta SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores. Creacin de una tabla mediante SELECT INTO: Creacin de una tabla que a la vez se le introducen valores. SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen WHERE CondicionBusqueda select apellido,salario,dept_no into #Temporal from emp where dept_no = 60 Se utiliza mucho para crear tablas temporales Insercin de datos parciales: No introducir todos los datos, solo meter datos en un determinado campo o en varios, pero no en toda la tabla. Insercin de datos mediante valores de columna predeterminados: Se usa para no dejar a las tablas con el valor null y as no da error. Se utilizan dos clausulas: DEFAULT: Especificar que cogiera en la lista de valores el valor por defecto de esa columna DEFAULT VALUES: Crea una nueva fila con los valores por defecto de todas las columnas
USE Hospital INSERT INTO emp (Apellido,Salario) VALUES (SERRA, DEFAULT) Con esta sentencia se pone el valor predeterminado que tenga la tabla, si no tiene valor por defecto, pondr null, lo que equivale a no poner el dato. Los valores por defecto se vern ms adelante.
56
ELIMINACIN DE DATOS DELETE: Elimina una o varias filas. Hay un control de las modificaciones (Borrado) que se estan haciendo. DELETE [FROM (Opcional) ] {NombreTabla | NombreVista } WHERE CondicionBusqueda Delete from emp where apellido = SERRA TRUNCATE TABLE: Elimina todas las filas de la tabla (La tabla con su estructura no se elimina, slo los datos de la tabla). No crea filas en el registro de transacciones, con lo cual es el mtodo ms rpido de borrar. TRUNCATE TABLE NombreTabla Truncate Table emp Eliminacin de filas basada en otras tablas DELETE [ FROM ] {NombreTabla | NombreVista} [ FROM, OrigenTabla,... ] [ WHERE CondicionBusqueda ] Borra los campos de emp donde tienen relacion con informtica delete from emp from emp as e inner join departamento as d on e.dept_no = d.dept_no where d.dnombre = 'INFORMATICA'
57
ACTUALIZACIONES Actualizacin de filas basadas en datos de la propia tabla UPDATE {NombreTabla | NombreVista } SET NombreColumna = expresin { DEFAULT | NULL, ... } USE Northwind UPDATE products SET unitprice = (unitprice * 1.1 ) Actualizacin de filas basadas en otras tablas UPDATE {NombreTabla | NombreVista } SET NombreColumna = expresin { DEFAULT | NULL, ... } FROM OrigenTabla WHERE CondicionBusqueda Cambiar el salario de los empleados del dept 30 donde el departamento sea 60. update emp set salario = 130000 from emp inner join dept on emp.dept_no = dept.dept_no where dept.dept_no = 60
58
CONSULTAS DE ACCION 1. Dar de alta con fecha actual al empleado Jose Escriche Barrera como programador perteneciente al departamento de informatica.Tendra un salario base de 70000 pts/mes y no cobrara comision, qu dificultad plantea el alta de este empleado? Cmo podria solucionarse ? Insert into dept(dept_no,dnombre,loc) values(60,'INFORMATICA','MADRID') Insert into emp(apellido,oficio,fecha_alt,salario,comision,dept_no) values('Escriche','PROGRAMADOR','07/02/02',70000,0,60) 2. Se quiere dar de alta un departamento de informtica situado en Fuenlabrada (Madrid). insert into dept(dept_no,dnombre,loc) values(70,'INFORMATICA','FUENLABRADA') 3. El departamento de ventas por motivos de peseteros se traslada a Lerida , realizar dicha modificacin. update dept set loc='LERIDA' where DNOMBRE='VENTAS' 4. En el departamento anterior se dan de alta dos empleados: Julin Romeral y Luis Alonso. Su salario base es de 80000 pts y cobrarn una comisin del 15% de su salario. insert into emp(dept_no,apellido,salario,comision,emp_no) values(30, 'Romeral',80000,80000*0.15,7500) insert into emp(dept_no,apellido,salario,comision,emp_no) values(30, 'Alonso',80000,80000*0.15,7600) 5. Modificar la comisin de los empleados de la empresa, de forma que todos tengan un incremento del 10% del salario. update emp set salario=salario*1.1 6. Incrementar un 5% el salario de los interinos de la plantilla que trabajen en el turno de noche. update plantilla set salario = salario*1.05 where funcion='Interino' and T='N'
59
7. Incrementar en 5000 pts el salario de los empleados del departamento de ventas y del presidente, tomando en cuenta los que se dieron de alta antes que el presidente de la empresa. update emp set salario = salario + 5000 from emp as e inner join dept as d on e.dept_no = d.dept_no WHERE FECHA_ALT < (select fecha_alt from emp where oficio = 'PRESIDENTE') AND e.OFICIO = 'PRESIDENTE' OR d.dnombre = 'VENTAS' 8. Se tienen que desplazar cien camas del Hospital SAN CARLOS para un Hospital de Venezuela. Actualizar el nmero de camas del Hospital SAN CARLOS. update Hospital set num_cama = num_cama-100 where nombre='San Carlos' 9. Crear una tabla llamada Mujeres e insertar los enfermos con este sexo. insert into Mujeres select * from enfermo where S = 'F' 10. Crear una tabla llamada Empleados e introducir todos los datos de la tabla EMP en ella. INSERT INTO empleados select * from emp 11. Utilizar la tabla anterior. Subir el salario y la comisin en un milln de pesetas y doscientas veinticinco mil pesetas respectivamente a los empleados que se dieron de alta en este ao. update empleados set salario = salario + 1000000/12, comision = comision + 225000/12 where fecha_alt > '01/01/02'
12. Borrar de la tabla mujer al enfermo con nmero de inscripcin igual a 64823. delete from Mujeres where inscripcion= '64823' 13. Borrar todos los registros de la tabla Mujeres de la forma ms rpida. truncate table mujeres 14. Utilizar la tabla Empleados. Borrar todos los empleados dados de alta entre las fechas 01/01/80 y 31/12/82. delete from empleados where fecha_alt between '01/01/80' and '31/12/82'
60
15. Modificar el salario de los empleados trabajen en la paz y esten destinados a Psiquiatra. Subirles el sueldo 20000 ptas ms que al seor Amigo R. update plantilla set salario = (select salario + 20000 from plantilla where apellido = 'Amigo R.') from plantilla as p inner join hospital as h on h.hospital_cod = p.hospital_cod inner join sala as s on s.sala_cod = p.sala_cod where h.nombre = 'La Paz' and s.nombre = 'Psiquitricos' 16. Borrar los empleados cuyo nombre de departamento sea produccin. delete from emp from emp as e inner join departamento as d on e.dept_no = d.dept_no where d.dnombre = 'PRODUCCION'
61
MDULO 4: PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS En el examen de certificacin las bases de datos que se suelen usar son las que vienen de ejemplo en SQL, es decir Northwind y Pubs Use Base de datos Indica que la siguiente sentencia usar la base de datos indicada. Ejemplo: Ponemos en el analizador de consultas lo siguiente: Use Hospital Select * from Hospital [Order Details] Esta tabla perteneciente a la Northwind, se encarga de manejar los pedidos Order Id : N de Pedido. Producto Id : N de Producto. Ambos campos son Primary Key, con lo que no puede haber una combinacin de ambos campos que sea igual. OrderId 1 1 1 2 3 ProductId A B C A C
Es decir en este caso no podra existir una nueva combinacin 1 A o 2 A. Quantity: Es la cantidad del producto del pedido. ROLLUP Se usa para presentar resmenes de datos. A de usarse junto con la clausula group by, lo que hace es realizar un resumen de los campos incluidos en el rollup. Select ProductID, OrderId, Sum(Quantity) As Cantidad_Total From [Order Details] Group by ProductID, OrderID with Rollup Order by ProductID, OrderID
Este ejemplo suma todas las cantidades, y mediante rollup, muestra una fila con la suma de todas las cantidades de cada producto, y adems, otra fila con la suma de todas las cantidades de todos los productos. El resultado de este ejemplo, sera el que muestra la imagen:
62
Select ProductID, OrderId, Sum(Quantity) As Cantidad_Total From [Order Details] where orderid < 10250 Group by ProductID, OrderID with Rollup Order by ProductID, OrderID
CUBE Al igual que Rollup realiza resmenes de campos agrupados. Pero en este caso muestra un resumen con cada combinacin posible de los campos agrupados. Select ProductID, OrderId, Sum(Quantity) As Cantidad_Total From [Order Details] where orderid < 10250 Group by ProductID, OrderID with Cube Order by ProductID, OrderID En este caso como vemos en la imagen, hace un resumen con la suma de la cantidad de cada combinacin posible entre el productid y el orderid
GROUPING Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una clusula de resumen, es decir, para saber por ejemplo si un Null de una celda es de la propia tabla o ha es debido a una clausula Cube o Rollup. Select Productid, grouping(ProductID), Orderid, grouping(OrderId), Sum(Quantity) As Cantidad_Total From [Order Details] where orderid < 10250 Group by ProductID, OrderID with Cube Order by ProductID, OrderID
63
Vemos que por cada grouping que hemos puesto, sale una columna, 1 indica que el Null es creado por la clausula Cube y 0 indica que es de la tabla. Ponindole un alias al grouping saldra el nombre de columna que le indiquemos. COMPUTE Realiza un resumen en una columna aparte con el resultado de la funcin de agregado indicada. Su formato sera Compute funcin(campo). No se puede utilizar en aplicaciones cliente / servidor, es una clausula meramente informativa. Tampoco se le pueden poner alias a los resmenes. Select Productid, Orderid, Quantity From [Order Details] order by ProductID, Orderid compute Sum(quantity)
Vemos que muestra la columna con la suma total de todas las cantidades.
64
COMPUTE BY Hace un resumen similiar al realizado mediante Cube o Rollup. Realiza grupos del campo indicado, y muestra el resultado de la funcin indicada en una columna aparte por cada grupo que haya. Su formato es Compute Funcin(campo) By Campo NOTA: Los campos por los que van despus de la clausula By deben ir incluidos en la clausula ORDER BY y adems en el mismo orden en el que aparecen. Select Productid, Orderid, Quantity From [Order Details] order by ProductID, Orderid compute Sum(quantity) by productId
select apellido, dept_no, salario from emp order by dept_no, apellido compute sum(salario) by dept_no
65
El resultado de este procedimiento se puede mostrar en lugar de en cuadrculas, mediante texto, para ello, realizaremos los siguientes pasos:
66
(-(5&,&,26&21&20387( 1) Generar un resumen de subtotales en una consulta que devuelva el nmero de pedido, la cantidad pedida para todos los orderid 11070
6HOHFW2UGHULGDV>13(','2@4XDQWLW\$6>&$17,'$'@ )URP>2UGHU'HWDLOV@ ZKHUHRUGHULG! RUGHUE\2UGHULG FRPSXWH6XPTXDQWLW\E\RUGHULG FRPSXWHVXPTXDQWLW\
13(','2&$17,'$' VXP VXP ILODVDIHFWDGDV
2) Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y 11076
6HOHFW2UGHULGDV>13(','2@4XDQWLW\DV>&$17,'$'@ )URP>2UGHU'HWDLOV@ ZKHUHRUGHULG RURUGHULG RUGHUE\2UGHULG FRPSXWH6XPTXDQWLW\E\RUGHUHG
13(','2&$17,'$' VXP 13(','2&$17,'$' VXP ILODVDIHFWDGDV
67
3) Modificacin al ejercicio anterior: Agregar la cantidad total y la cantidad promedio al final del informe
6HOHFW2UGHULGDV>13(','2@4XDQWLW\DV>&$17,'$'@ )URP>2UGHU'HWDLOV@ ZKHUHRUGHULG RURUGHULG RUGHUE\2UGHULG FRPSXWH6XPTXDQWLW\E\RUGHULG FRPSXWHVXPTXDQWLW\ FRPSXWHDYJTXDQWLW\
13(','2&$17,'$' VXP 13(','2&$17,'$' VXP VXP DYJ ILODVDIHFWDGDV
4) Seleccionar de forma agrupada por tipo, todos los tipos, la suma de los precios y la suma del anticipo de la tabla ttulos
6HOHFWW\SHDV>7,32@SULFHDV>35(&,2@DGYDQFHDV>$17,&,32@ )URPWLWOHV RUGHUE\W\SH FRPSXWHVXPSULFHE\W\SH FRPSXWHDYJDGYDQFHE\W\SH
7,3235(&,2$17,&,32 EXVLQHVV EXVLQHVV EXVLQHVV EXVLQHVV
68
VXP DYJ 7,3235(&,2$17,&,32 PRGBFRRN PRGBFRRN VXP DYJ 7,3235(&,2$17,&,32 SRSXODUBFRPS SRSXODUBFRPS SRSXODUBFRPS18//18// VXP DYJ 7,3235(&,2$17,&,32 SV\FKRORJ\ SV\FKRORJ\ SV\FKRORJ\ SV\FKRORJ\ SV\FKRORJ\ VXP DYJ ILODVDIHFWDGDV
69
70
*HQHUDUXQLQIRUPHTXHPXHVWUHODVXPDGHORVSUHFLRVGHORVOLEURVGH SVLFRORJtDGHFDGDHGLWRU
71
7,32&2',*2(',72535(&,2 SV\FKRORJ\ VXP VXP ILODVDIHFWDGDV
*HQHUDUXQLQIRUPHTXHREWHQJDODVXPDGHORVSUHFLRV\ORVDQWLFLSRV SDUDFDGDWLSRGHOLEURGHFRFLQD
7,32&2',*2(',72535(&,2$17,&,32 PRGBFRRN PRGBFRRN VXP VXP 7,32&2',*2(',72535(&,2$17,&,32 WUDGBFRRN WUDGBFRRN WUDGBFRRN VXP VXP ILODVDIHFWDGDV
72
6HOHFWWLWOHDV>7,78/2@ SULFHDV>35(&,2@ DGYDQFHDV>$17,&,32@ )URPWLWOHV ZKHUHSULFH! RUGHUE\WLWOH FRPSXWHVXPSULFH FRPSXWHVXPDGYDQFH
7,78/235(&,2$17,&,32 %XW,V,W8VHU)ULHQGO\" &RPSXWHU3KRELF$1'1RQ3KRELF,QGLYLGXDOV%HKDYLRU9DULDWLRQV 2QLRQV/HHNVDQG*DUOLF&RRNLQJ6HFUHWVRIWKH0HGLWHUUDQHDQ VXP VXP ILODVDIHFWDGDV
73
74
52//83 1) Realizar una consulta que resuma la cantidad de artculos pedidos por cada ndice de producto y nmero de pedido. Realizando un clculo acumulativo.
VHOHFWSURGXFWLGDV>352'8&72@ RUGHULGDV>13(','2@ VXPTXDQWLW\DV>680$727$/@ IURP>2UGHU'HWDLOV@ JURXSE\SURGXFWLGRUGHULG ZLWKUROOXS RUGHUE\SURGXFWLGRUGHULG
352'8&7213(','2680$727$/ 18//18// 18//
2) Modificacin al ejercicio anterior: Realizar el mismo resumen pero nicamente para el producto cuyo id es 50
JURXSE\SURGXFWLGRUGHULG
75
3) Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacin del ejercicio anterior de tal manera que sea posible obtener un resumen por producto y por pedido.
VHOHFW3URGXFWLGDV>352'8&72@ JURXSLQJSURGXFWLGDV>*5832352'8&72@ RUGHULGDV>13(','2@ JURXSLQJRUGHULGDV>*58323(','2@ VXPTXDQWLW\DV>680$727$/@ IURP>2UGHU'HWDLOV@ ZKHUHSURGXFWLG ZLWKFXEH RUGHUE\SURGXFWLGRUGHULG
352'8&72*5832352'8&7213(','2*58323(','2680$727$/ 18//18// 18// 18// 18// 18// 18// 18// 18// 18// 18// 18// 18// ILODVDIHFWDGDV
JURXSE\3URGXFWLGRUGHULG
4XpILODVVRQGHUHVXPHQ"&XiOHVHOUHVXPHQSRUSURGXFWR\FXiOHVSRUSHGLGR"
76
TRANSACCIONES Una transaccin es un conjunto de instrucciones de manipulacin de datos que se ejecutan en una misma unidad de trabajo. El ejemplo ms claro son las transacciones bancarias. Inicio de una transaccin: BEGIN TRAN[SACTION][NombreTransaccion] Validacin de transaccin: COMMIT TRAN[SACTION] [NombreTransaccion] Decalracin de punto de control: SAVE TRAN[SACTION] [NombrePuntoControl] Anulacin de Transaccin: ROLLBACK TRAN[SACTION] [NombreTransaccion | NombrePuntoControl] BEGIN TRAN Modificacin UPDATE Tabla SET .... UPDATE Tabla1 SET .... SAVE TRAN a UPDATE Tabla2 SET .... UPDATE Tabla3 SET .... ROLLBACK TRAN a ROLLBACK TRAN Modificacion COMMIT TRAN Modificacin El primer Rollback guardaria las que estan en el Begin y el punto de salvamento, deshaciendo las dems ordenes. Ejemplo de transacciones usando @@ERROR, con esto se almacena el nmero del error que se ha producido en ltima instancia. Se actualiza en cada instruccin, por eso despus de cada sentencia se debe comprobar el valor de la variable para ver si tiene error. Lo que se hace es crear variables en cada instruccin almacenando el valor de @@ERROR en cada una de ellas. El valor de las variables debe ser entero.
77
USE Pubs GO DECLARE @del_error int, @ins_error int BEGIN TRAN DELETE authors WHERE au_id = '409-56-7088' SELECT @del_error = @@ERROR INSERT authors VALUES ('409-56-7008', 'Bennet', 'Abraham', '415 658-9932', '6223 Bateman St.', 'Berkeley', 'CA', '94705', 1) SELECT @ins_error = @@ERROR IF @del_error = 0 AND @ins_error = 0 BEGIN PRINT 'No hay errores Nino Nino' COMMIT TRAN END ELSE BEGIN IF @del_error <> 0 PRINT 'Hay error en el DELETE' PRINT @ins_error IF @ins_error <> 0 PRINT 'Hay error en el INSERT' PRINT @ins_error ROLLBACK TRAN END GO
78
FUNCIONES DE FECHA Parte de la fecha Year Quarter Month dayofyear Day Week Hour Minute Second Millisecond GetDate
select getdate()
Abreviaturas yy, yyyy qq, q mm, m dy, y dd, d wk, ww Hh mi, n ss, s Ms
Convert, Cast Convierten explcitamente una expresin de un tipo de datos en otro. CAST y CONVERT proporcionan funciones similares. Convert(Tipodedatosdestino, Origen, Estilo) o Tiposdedatosdestino: Siempre ha de ser tipo carcter o Origen: Puede ser tipo fecha, numrico o moneda. o Estilo: Opcional. Es un cdigo que indica el formato en el que devuelve la cadena de caracteres. Sintaxis: Convert(TipoDato,Dato) Cast (Dato as TipoDato)
Ejemplo: declare @n int,@palabra nvarchar(10) set @n = 1 set @palabra ='Nmero' print convert(nvarchar(2),@n) + ' ' + @palabra print cast(@n as nvarchar(2)) + ' ' + @palabra while (@n<11) begin print convert(nvarchar(2),@n) + ' ' + @palabra print cast(@n as nvarchar(2)) + ' ' + @palabra set @n = @n + 1 end
79
DateName Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha especificada Los calculos para las horas no son exactos cuando se trata de SmallDateTime, por lo que devuelve 0. select datename(month,fecha_alt) as 'Nombre mes' from emp where emp_no = 7867 diciembre
select datename(m,fecha_alt) as 'Nombre mes' from emp where emp_no = diciembre 7867 select datename(week,fecha_alt) as 'Numero Semana' from emp where emp_no = 7867 51 select datename(week,fecha_alt) as 'Numero Semana' from emp where emp_no = 7867 51 select datename( weekday,fecha_alt) as 'Dia Semana' from emp where emp_no=7867 miercoles select datename(dw,fecha_alt) as 'Dia Semana' from emp where emp_no=7867 miercoles
Horas:
select 7867 select select select select select datename(mi,fecha_alt) as 'Minutos' from emp where emp_no = datename( datename( datename( datename( datename( minute,getdate()) as 'minutos' mi,getdate()) as 'minutos' hh,fecha_alt) as 'hora' from emp where emp_no = 7867 hour,getdate()) as 'hora'-->17 hh,getdate()) as 'hora'-->17
Nombres de Fechas
Day(fecha) Devuelve un INT, equivale a datepart select day(getdate()) as dia-->12 select datepart(dd,getdate())-->12 select month(getdate())-->7 select datepart(mm,getdate())-->7 select year(getdate())-->2002 select year(fecha_alt) from emp where emp_no = 7867 select datediff(yyyy,fecha_alt,getdate()) as Diferencia from emp where emp_no = 7867
80
DateAdd
DateAdd( datepart , number, date ) Aade un nmero a la fecha puesta DatePart es el formato de lo que queremos aadir. Number es el nmero que queremos incrementar la fecha expuesta. select convert(datetime,'1-1-02') select dateadd(dd,7,'1-1-02')
DateDiff Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos. Sintaxis: DateDiff (DatoqueDevuelve, Fecha1, Fecha2) o Datoquedevuelve: Indicamos como queremos que haga la comparacin y el tipo de dato que nos devolver, aos, das, minutos etc.
select datediff(yyyy,fecha_alt,getdate()) as 'Diferencia' from emp where emp_no = 7867
81
CEILING
Devuelve el entero ms pequeo mayor o igual que la expresin numrica dada. Select CEILING(5.4) as 'CEILING'--6
FLOOR
Devuelve el entero ms grande menor o igual que la expresin numrica dada. Select FLOOR(5) as 'FLOOR'-->5
POWER
Devuelve el valor de la expresin indicada elevada a la potencia especificada. Select POWER(3,2) as '3 ELEVADO A 2'-->9
RAND
Devuelve un valor float aleatorio de 0 a 1. Las llamadas repetitivas de RAND() en una nica consulta producirn el mismo valor. Select RAND(6) as 'ALEATORIO'--0.71368515806921451 Select RAND(6) as 'ALEATORIO'--0.71368515806921451 Select RAND(4) as 'ALEATORIO'--0.7136478921266981 Rand sobre los milisegundos actuales Select RAND(DATEPART(ms,GETDATE())) as 'ALEATORIO'->0.71443047691954253 Select RAND(999999999)-->0.68504257551273573
ROUND
Devuelve una expresin numrica, redondeada a la longitud o precisin especificada. Round(Numero, Redondeo del Nmero) ROUND siempre devuelve un valor. Si length es un valor negativo y mayor que el nmero de dgitos anteriores al separador decimal, ROUND devuelve 0. Select Select Select Select ROUND(123.4567,2)-->123.4600 ROUND(123.4567,-2)-->100.0000 ROUND(123.4567,0)-->123.0000 ROUND(123.4567,-3)--->0
82
SIGN Devuelve el signo positivo (+1), cero (0) o negativo (-1) de la expresin especificada. Dice el valor negativo, positivo o neutro (0) del valor especificado
Select SIGN(-3)-->-1 Select SIGN(3)-->1 Select SIGN(0)-->0
SQUARE
Devuelve el cuadrado de la expresin especificada. Select SQUARE(4) as Cuadrado-->16.0
SQRT
Devuelve la raz cuadrada de la expresin especificada. Select SQRT(4) as [RAIZ CUADRADA]-->2.0
83
CHAR
Una funcin de cadena que convierte un cdigo ASCII int en un carcter. select char(65)-->A select char(97)-->a
CHARINDEX
Devuelve la posicin inicial de la expresin especificada en una cadena de caracteres. CHARINDEX ( expression1 , expression2 [ , start_location ] ) Argumentos expression1 Es una expresin que contiene la secuencia de caracteres que se desea buscar. Expression1 es una expresin del tipo de cadenas cortas de caracteres. Expression2 Es una expresin, normalmente una columna, en la que se busca la cadena especificada. Expression2 es de la categora del tipo de datos cadena de caracteres. start_location Es la posicin del carcter de expression2 en el que se empieza la bsqueda de expression1. Si no se especifica start_location, es un nmero negativo o es cero, la bsqueda empieza al principio de la cadena expression2. Si expression1 no se encuentra en expression2, CHARINDEX devuelve 0. Si alguno de los dos es null, devuelve null select select select select charindex('cie','murcielago')-->4 charindex('cie','murcielago',2)-->4 charindex('cie','murcielago',5)-->0 charindex('cie','murcielago',-6)-->4
84
LEFT
Devuelve la parte de una cadena de caracteres que comienza en un nmero de caracteres especificado a partir de la izquierda select left('murcielago',5)-->murci
RIGHT
Devuelve la parte de una cadena de caracteres que comienza en el nmero de caracteres especificado en integer_expression a partir de la derecha. select right('hola que tal',5)-->e tal
LEN
Cuenta el nmero de caracteres que se incluyen en la cadena. select len('murcielago')-->10
LOWER
Convierte a Minsculas la cadena especificada select lower('MurcIELaGO') as [minusculas]-->murcielago
UPPER
Convierte a Maysculas la cadena especificada select upper('murcielago') as [MAYUSCULAS]-->MURCIELAGO
RTRIM y LTRIM Elimina los espacios que existen a la izquierda y a la derecha respectivamente.
select Rtrim (' murcielago select Ltrim (' murcielago select ltrim(rtrim(' hola ') AS [SIN ESPACIOS]-->murcielago ') AS [SIN ESPACIOS]-->murcielago '))+'.'
REPLACE
Reemplaza por una tercera expresin todas las apariciones de la segunda expresin de cadena proporcionada en la primera expresin de cadena select replace('hola que tal estas','a','A')-->holA que tAl estAs select replace('buenos dias, que tal estas','ue','')-->bnos dias,q tal estas
85
SPACE Coloca el nmero de espacios que se le indiquen para entre una cadena de caracteres.
select 'hola'+space(5)+'que tal'-->hola que tal
SUBSTRING
Devuelve parte de una expresin de caracteres, binaria, de texto o de imagen. Sintaxis: SUBSTRING (Expresin , Comienzo , Duracin ) Argumentos expression Es una cadena de caracteres, cadena binaria, texto, imagen, columna o expresin que incluye una columna. No deben usarse expresiones que incluyan funciones de agregado. start Es un entero que especifica el punto en que comienza la subcadena. length Es un entero que especifica la longitud de la subcadena (el nmero de caracteres o bytes que se devuelven). select substring('murcielago',3,5)-->rciel select substring('murcielago',3,len('murcielago'))-->rciel
REVERSE
Devuelve invertida una expresin de carcter. select reverse('hola')
REPLICATE
Repite una expresin de caracteres un nmero especificado de veces. select replicate('murcielago',5) replicate, replicate, replicate, replicate, replicate
STUFF
Elimina el nmero de caracteres especificado e inserta otro conjunto de caracteres en un punto de inicio indicado. Select STUFF('Murcielago', 2, 3, 'ijklmn')
Mijklmnielago
86
FUNCIONES DE SISTEMA APP_NAME () Devuelve el nombre de la aplicacin actual select app_name() as [Nombre de la aplicacion]
DATALENGTH (Expresion) Devuelve un entero que es numero de bites necesarios para representar esa expresin int select datalength('Ninoni') as [Numero de bites]
ISDATE (Expresion) Dice si la expresin es una fecha o no. Devuelve 1 si la expresin es una fecha y 0 si no es una fecha. select isdate ('12/10/01') as [Validacion Fecha]
ISNUMERIC (Expresion) Dice si la expresin es un numero o no. Devuelve 1 si la expresin es un nmero y 0 si la expresin no es nmero. select isnumeric('ddd') as [Validacion Numero]
ISNULL (Expresin , ExpresionDevuelta) Si la expresin es nula te devuelve la Expresin Devuelta y si no devuelve la primera Expresin select isnull (null,'No nulo') as [Es Nulo]
87
PARSENAME (NombreObjeto, ParteNombre) ParteNombre es un valor de tipo Int que coge unos determinados valores del NombreObjeto: 1 Objeto. 2 Propietario 3 Base de Datos 4 Servidor select parsename('Serra.Hospital.dbo.emp',1) as [Parte Expresion] select parsename('Serra.Hospital.dbo.emp',2) as [Parte Expresion] select parsename('Serra.Hospital.dbo.emp',3) as [Parte Expresion] select parsename('Serra.Hospital.dbo.emp',4) as [Parte Expresion]
SYSTEM_USER Devuelve el usuario del sistema actual Depende de la autentificacin con la que te hayas conectado select system_user as [Usuario conectado]
COALESCE (expresin1, expresin2, ...) Devuelve la primera expresin no NULL Si todos son NULL devuelve NULL
select coalesce(Salario,Comision) from emp Si el Salario es nulo devolver la comisin, y si los dos son nulos, devolver un campo null.
88
EJERCICIOS IF y FUNCIONES
1. Mostrar una lista de los empleados con el siguiente texto. Si el empleado no tiene nombre o la consulta devuelve null poner el texto de EMPLEADO SIN NOMBRE.
select isnull('El seor ' + cast(apellido as nvarchar(15)) + ' con cargo de ' + cast(oficio as nvarchar(15)) + ' se di de alta el ' + cast(day(fecha_alt) as char(2)) + ' de ' + cast(datename(month,fecha_alt) as nvarchar(14)) + ' de ' + cast(year(fecha_alt) as char(4)),'EMPLEADO SIN NOMBRE') as [DATOS EMPLEADOS] from emp order by fecha_alt
'$726(03/($'26 (03/($'26,1120%5( (03/($'26,1120%5( (OVHxRU6(55$FRQFDUJRGH(03/($'2VHGLyGHDOWDHOGH'LFLHPEUHGH (OVHxRU6(55$12FRQFDUJRGH',5(&725VHGLyGHDOWDHOGH)HEUHURGH (OVHxRU6$/$FRQFDUJRGH',5(&725VHGLyGHDOWDHOGH6HSWLHPEUHGH (OVHxRU$552<2FRQFDUJRGH9(1'('25VHGLyGHDOWDHOGH)HEUHURGH (OVHxRU-,0(1(=FRQFDUJRGH',5(&725VHGLyGHDOWDHOGH$EULOGH (OVHxRU1(*52FRQFDUJRGH',5(&725VHGLyGHDOWDHOGH0D\RGH (OVHxRU&(5(=2FRQFDUJRGH',5(&725VHGLyGHDOWDHOGH-XQLRGH (OVHxRU729$5FRQFDUJRGH9(1'('25VHGLyGHDOWDHOGH6HSWLHPEUHGH (OVHxRU0$57,1FRQFDUJRGH9(1'('25VHGLyGHDOWDHOGH6HSWLHPEUHGH (OVHxRU5(<FRQFDUJRGH35(6,'(17(VHGLyGHDOWDHOGH1RYLHPEUHGH (OVHxRU)(51$1'(=FRQFDUJRGH$1$/,67$VHGLyGHDOWDHOGH'LFLHPEUHGH (OVHxRU08f2=FRQFDUJRGH(03/($'2VHGLyGHDOWDHOGH-XQLRGH (OVHxRU*,/FRQFDUJRGH$1$/,67$VHGLyGHDOWDHOGH0DU]RGH (OVHxRU$/2162FRQFDUJRGH(03/($'2VHGLyGHDOWDHOGH0D\RGH (OVHxRU$*8'2FRQFDUJRGH9(1'('25VHGLyGHDOWDHOGH1RYLHPEUHGH (OVHxRU0$57$FRQFDUJRGH$/801$VHGLyGHDOWDHOGH2FWXEUHGH (OVHxRU58,=FRQFDUJRGH$1$/,67$VHGLyGHDOWDHOGH-XOLRGH ILODVDIHFWDGDV
2. Modificacin del ejercicio anterior, incluir tambin la diferencia de aos que lleva en la empresa el empleado desde la fecha actual.
select isnull('El seor ' + LTRIM(cast(apellido as nvarchar(15))) + ' con cargo de ' + ltrim(cast(oficio as nvarchar(15))) + ' se di de alta el ' + cast(day(fecha_alt) as char(2)) + ' de ' + ltrim(cast(datename(month,fecha_alt) as nvarchar(15))) + ' de ' + cast(year(fecha_alt) as char(4)) + ' y lleva en la empresa ' + ltrim(cast(datediff(yyyy,fecha_alt,getdate()) as nvarchar(5))) + ' aos','EMPLEADO SIN NOMBRE') as [DATOS EMPLEADOS] from emp order by fecha_alt
89
DATOS EMPLEADOS --------------------------------------------------------------------------------EMPLEADO SIN NOMBRE EMPLEADO SIN NOMBRE El seor SERRA con cargo de EMPLEADO se di de alta el 11 de Diciembre de 1971 y lleva en la empresa 31 aos El seor SERRANO con cargo de DIRECTOR se di de alta el 19 de Febrero de 1973 y lleva en la empresa 29 aos El seor SALA con cargo de DIRECTOR se di de alta el 19 de Septiembre de 1976 y lleva en la empresa 26 aos El seor Arias con cargo de Analista se di de alta el 1 de Agosto de 1978 y lleva en la empresa 24 aos El seor Toro con cargo de Director se di de alta el 10 de Febrero de 1979 y lleva en la empresa 23 aos El seor ARROYO con cargo de VENDEDOR se di de alta el 22 de Febrero de 1981 y lleva en la empresa 21 aos El seor JIMENEZ con cargo de DIRECTOR se di de alta el 2 de Abril de 1981 y lleva en la empresa 21 aos El seor NEGRO con cargo de DIRECTOR se di de alta el 1 de Mayo de 1981 y lleva en la empresa 21 aos El seor CEREZO con cargo de DIRECTOR se di de alta el 9 de Junio de 1981 y lleva en la empresa 21 aos El seor TOVAR con cargo de VENDEDOR se di de alta el 8 de Septiembre de 1981 y lleva en la empresa 21 aos El seor MARTIN con cargo de VENDEDOR se di de alta el 28 de Septiembre de 1981 y lleva en la empresa 21 aos El seor REY con cargo de PRESIDENTE se di de alta el 17 de Noviembre de 1981 y lleva en la empresa 21 aos El seor FERNANDEZ con cargo de ANALISTA se di de alta el 3 de Diciembre de 1981 y lleva en la empresa 21 aos El seor MARTA con cargo de ALUMNA se di de alta el 12 de Octubre de 2001 y lleva en la empresa 1 aos (33 filas afectadas)
3. Subir el sueldo en 5000 pts a los empleados de la plantilla del hospital La Paz en caso de que la suma de sus salarios no supere el millon de pesetas, en caso contrario bajar el sueldo en 5000 pts.
declare @SumaSal int select @SumaSal = sum(salario) from plantilla as p inner join hospital_cod as h on p.hospital_cod = h.hospital_cod where h.nombre = 'La Paz' print @sumasal if (@SumaSal) < 1000000 begin --Subimos el sueldo update plantilla set salario = salario + 5000 from plantilla as p inner join hospital_cod as h on p.hospital_cod = h.hospital_cod where h.nombre = 'La Paz' --Notificamos la subida select 'Al empleado del Hospital ' + h.nombre + ', ' + p.apellido + ' con funcin de ' + p.funcion + ', se le ha subido el sueldo en 5000 pts' from plantilla as p inner join hospital_cod as h on p.hospital_cod = h.hospital_cod where h.nombre = 'La Paz' end
90
else begin --Bajamos el sueldo update plantilla set salario = salario - 5000 from plantilla as p inner join hospital_cod as h on p.hospital_cod = h.hospital_cod where h.nombre = 'La Paz' --Notificamos la bajada select 'Al empleado del Hospital ' + h.nombre + ', ' + p.apellido + ' con funcin de ' + p.funcion + ', se le ha reducido el sueldo en 5000 pts' from plantilla as p inner join hospital_cod as h on p.hospital_cod = h.hospital_cod where h.nombre = 'La Paz' end
------------------------------------------------------------------------------------------------Al empleado del Hospital La Paz, Higueras D. con funcin de Enfermera, se le ha reducido el sueldo en 5000 pts Al empleado del Hospital La Paz, Rivera G. con funcin de Enfermera, se le ha reducido el sueldo en 5000 pts Al empleado del Hospital La Paz, Carlos R. con funcin de Enfermera, se le ha reducido el sueldo en 5000 pts Al empleado del Hospital La Paz, Bocina G. con funcin de Enfermero, se le ha reducido el sueldo en 5000 pts Al empleado del Hospital La Paz, Nez C. con funcin de Interino, se le ha reducido el sueldo en 5000 pts (5 filas afectadas)
4. Calcular la media de aos que llevan los empleados en la empresa. Si la media supera los 15 aos, subir el sueldo en 20000 pts a los empleados que esten en la primera decada desde la fundacin de la empresa. Si no se supera esta media, se les subir el sueldo a los empleados que no estn en la primera decada de la empresa. Mostrar los datos despus de la actualizacin con formato de Fecha Completa: Martes 19 Octubre 1978.
declare @Media int,@MinFecha smalldatetime,@Dif smalldatetime select @MinFecha = min(fecha_alt) from emp select @Media = avg(datediff(yy,fecha_alt,getdate())) from emp select @dif = dateadd(yy,10,@minfecha) if (@Media > 15) begin update emp set salario = salario + 20000 where fecha_alt between @minfecha and @dif select datename(weekday,fecha_alt) + ' ' + cast(datepart(day,fecha_alt) as char(2)) + ' ' + datename(month,fecha_alt) + ' ' + datename(year,fecha_alt) as [FECHA COMPLETA] ,Apellido
91
,Salario,'Actualizacion Completa' as [ACTUALIZACION] from emp where fecha_alt between @minfecha and @dif order by fecha_alt end else begin update emp set salario = salario + 10000 where fecha_alt > @dif select datename(weekday,fecha_alt) + ' ' + cast(datepart(day,fecha_alt) as char(2)) + ' ' + datename(month,fecha_alt) + ' ' + datename(year,fecha_alt) as [FECHA COMPLETA] ,Apellido ,Salario,'Actualizacion Completa' as [ACTUALIZACION] from emp where fecha_alt > @dif order by fecha_alt end
5. Mostrar los aos de antigedad de los empleados, la fecha de alta, y otro campo donde introduciremos los trienios que lleva en la empresa el trabajador hasta 7 como mximo y cuatro como mnimo. Si est fuera de este intervalo escribiremos No Bonificable.
Select Apellido, Fecha_Alt ,'Antigedad' = convert(nvarchar(50) ,datediff(yy,fecha_alt, getdate())) + ' aos' ,'Trienios' = case datediff(yy,fecha_alt, getdate()) / 3 When '4' Then 'Cuatro' When '5' Then 'Cinco' When '6' Then 'Seis' When '7' Then 'Siete' Else 'No Bonificable' End From Emp
92
6. Calculando la suma de salarios de los directores, subir el sueldo a los que cobren entre el minimo salario y 250000 pts. Mantener el sueldo a los directores si la suma est entre 1200000 y 1300000. Bajar el sueldo a los que se encuentren entre 250000 y el mximo salario. Mostrar los datos actualizados antes y despus de los empleados que se actualicen.
if (select sum(salario) from emp where oficio = 'director') < 1200001 BEGIN PRINT 'Sueldo subido a los directores' declare @MinSal int select @MinSal = min(salario) from emp where oficio = 'director' print 'Antes de la Actualizacin' select top 3 with ties salario,apellido from emp where oficio = 'director' group by salario,apellido having salario between @MinSal and 250000 order by salario update emp set salario = salario * 1.1 where oficio = 'director' and salario between @MinSal and 250000 update emp set salario = salario * 1.1 where oficio = 'director' print 'Despus de la Actualizacin' select top 3 with ties salario,apellido from emp where oficio = 'director' group by salario,apellido having salario between @MinSal and 250000 order by salario END else if (select sum(salario) from emp where oficio = 'director') between 1200001 and 1300000 begin print 'Mismo sueldo a los directores' select salario,apellido from emp where oficio = 'director' order by salario compute max(salario)
93
end else if (select sum(salario) from emp where oficio = 'director') > 1300001 begin print 'Sueldo bajado a los directores' declare @Maxsal int select @Maxsal = max(salario) from emp where oficio = 'director' print 'Antes de la Actualizacin' select top 3 with ties salario,apellido from emp where oficio = 'director' group by salario,apellido having salario between 200000 and @MaxSal order by salario desc update emp set salario = salario / 1.1 where oficio = 'director' and salario between 200000 and @MaxSal print 'Despus de la Actualizacin' select top 3 with ties salario,apellido from emp where oficio = 'director' group by salario,apellido having salario between 200000 and @MaxSal order by salario desc end
Sueldo bajado a los directores Antes de la Actualizacin salario apellido ----------- -------------------------------------------------418302 JIMENEZ 400729 NEGRO 344484 CEREZO (3 filas afectadas) (3 filas afectadas) Despus de la Actualizacin salario apellido ----------- -------------------------------------------------380274 JIMENEZ 364299 NEGRO 313167 CEREZO (3 filas afectadas)
94
RELACIONES ENTRE TABLAS Para realizar relaciones, teniendo el foco sobre Diagramas, botn derecho -> Nuevo diagrama de base de datos.
95
Establecemos las claves principales. Para ello, nos posicionamos sobre el campo que queramos y pulsamos el icono de la llave.
Nos posicionamos sobre el campo clave y hacemos clic sobre, el, sin soltar arrastramos hasta el campo con el que queremos establecer la relacin.
96
Nos saldr la pantalla de la imagen, en la que estableceremos las opciones de integridad referencial, actualizacin y borrado en cascada etc.
Despus de pulsar aceptar, estar establecida la relacin. Pulsamos el icono de guardar para guardarla.
97
PROCEDIMIENTOS CON PARMETROS Sintaxis: Create Procedure Procedimiento @NombreParametro Tipo de dato As Instrucciones Posteriormente lo ejecutamos introduciendo un valor/res correspondiente al parmetro/os introducido. Exec Procedimiento Valor Ejemplo 1 Create Procedure NumEmpDept @ndep smallint as select count(*) as [Num Empleados], dept_no from emp where dept_no = @ndep group by dept_no Crea el procedimiento numempdept con el parmetro ndep que es tipo smallint (equivalente al short en visual). El procedimiento hace una select que realiza grupos por nmero de deparamento y cuenta cuantos empleados hay en cada departamento. Exec NumEmpDept 20 Ejecuta el procedimiento introduciendo el valor 20 para el parmetro ndep, con lo que hara la select sobre el departamento 20. Ejemplo 2 CREATE PROCEDURE BuscaEmp @ndep smallint, @noficio nvarchar(19) AS Select * from emp PROCEDIMIENTOS ALMACENADOS CON PARMETROS CON VALORES POR DEFECTO Sintaxis: Create Procedure Nombre @Variable tipo = Valor As Instrucciones Donde Valor es el valor que le damos por defecto, este valor puede almacenar comodines (como % que equivale a *). Ejemplo 1 Create Procedure numemp @ndept smallint = 10 As Select dept_no, count(*) as [num empleados] From emp Where dept_no = @ndept Group by dept_no
98
Crea un procedimiento con el parmetro ndept y le da por defecto valor 10. Ejemplo 2 Debe devolver salario, oficio y comisin y le pasamos el apellido. CREATE PROCEDURE salariooficio @papellido varchar(20) = 'REY' AS Select oficio, salario, comision from emp where apellido = @papellido exec salariooficio Jimnez Sacara el salario, el oficio y la comisin de todos los que tengan apellido Jimnez, sino pusisemos parmetro, por defecto sacara los que tuviesen apellido Rey. Ejemplo 3 CREATE PROCEDURE salariooficiolike @papellido varchar(20) = 'REY' AS Select oficio, salario, comision from emp where apellido like '%' + @papellido + '%'; Exec salariooficio s Sacara oficio, salario y comisin de los empleados que tuviesen una s en su apellido. Ejemplo 4 Introducir oficio y salario debe sacar el apellido de los empleados que tengan el mismo apellido y ganen mas del salario indicado. Debemos hacer que sino introduce nada saque todos los registros. CREATE PROCEDURE dosparametros2 @oficio varchar(12) = '%', @salario varchar(10) = '0' AS select apellido from emp where oficio like @oficio and salario > @salario; Ejemplo 5 Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y que pertenecen a un determinado departamento. CREATE PROCEDURE tresparametros @finicial datetime = '01-01-1980', @ffinal smalldatetime = '12-07-2002' , @dept_no nvarchar(10) = '%' AS select * from emp where fecha_alt between @finicial and @ffinal and dept_no = @dept_no
99
Ejemplo 6 Crear procedimiento que inserte un empleado. Crear otro procedimiento que borre un empleado que coincida con los parmetros indicados (los parmetros sern todos los campos de la tabla empleado) CREATE PROCEDURE [Inserta Empleado] @emp_no int, @apellido nvarchar(20), @oficio nvarchar(20), @dir int, @fecha_alt smalldatetime, @salario int, @comision int, @dept_no int AS insert into emp values (@emp_no, @apellido, @oficio, @dir, @fecha_alt, @salario, @comision, @dept_no) CREATE PROCEDURE [Borra Empleado] @emp_no int, @apellido nvarchar(20), @oficio nvarchar(20), @dir int, @fecha_alt smalldatetime, @salario int, @comision int, @dept_no int AS delete from emp where emp_no = @emp_no and apellido = @apellido and oficio = @oficio and dir = @dir and fecha_alt = @fecha_alt and salario = @salario and comision = @comision and dept_no = @dept_no
100