sql server - procedimientos almacenados

75
Sql Server Procedimientos almacenados

Upload: carmeloes

Post on 19-Jun-2015

3.788 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: SQL Server - Procedimientos Almacenados

Sql Server

Procedimientos almacenados

Page 2: SQL Server - Procedimientos Almacenados

• Es fundamental en la gestión de BD– velocidad– eficiencia

– Los procedimientos almacenados están diseñados para optimizar la obtención de datos.

Page 3: SQL Server - Procedimientos Almacenados

Concepto de procedimientos almacenados

• consulta almacenada en una BD en Sql Server y en lugar de almacenarse en el código cliente se almacena en el equipo de servidor

Page 4: SQL Server - Procedimientos Almacenados

Razones para almacenar consultas en el servidor

• rendimiento• compilación• administración

Page 5: SQL Server - Procedimientos Almacenados

Rendimiento

• consulta normal– Use tu base de datos– select campos, campos,..– from nombre tabla– where condicion– order by campo a ordenar

Page 6: SQL Server - Procedimientos Almacenados

• en esta consulta sencilla– muchos usuarios ejecutando la misma consulta

todo el rato• trafico de red

– envian datos desde sus equipos al servidor– evitar trafico de red

» reducir cantidad codigo que se envia entre equipos» almacenar código en el servidor, no en el cliente

• el unico codigo que deben enviar los clientes será• EXEC nombredelprocedimiento

Page 7: SQL Server - Procedimientos Almacenados

Compilación

• Sql server compila una consulta– lee la consulta– reconoce los elementos• clausualas

– compara consulta con todos los indices disponibles para ganar tiempo

– crea el plan de ejecución– almacena el plan en memoria

Page 8: SQL Server - Procedimientos Almacenados

• los procedimientos almacenados ya están precompilados– ya ha pasado el proceso de compilación– tienen un plan en memoria– se ejecutan muy rápido

Page 9: SQL Server - Procedimientos Almacenados

Administración

• para modificar una consulta existente– hay que hacer cambios en todos los equipos– en procedimento almacenado• solo se cambia una vez

Page 10: SQL Server - Procedimientos Almacenados

• si una consulta se va a ejecutar una sola vez– no hay que crear procedimientos

• si los usuarios van a usar la consulta frecuentemente– crear un procedimiento definido por el usuario

que la contenga

Page 11: SQL Server - Procedimientos Almacenados

Procedimientos almacenados definidos por el usuario

• Procedimiento almacenado que no requiere ningún parámetro– abrimos Management Studio– Explorador de objetos• Base de datos – tu base de datos – Programación• Procedimientos almacenados – boton derecho – nuevo• se abre una plantilla en la ventana de consulta

Page 12: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE esquema.nombre del procedimiento

• WITH EXECUTE AS CALLER– SQL Server personaliza al llamador al ejecutar el

procedimiento• SELECT– los campos a mostrar

• WHERE– condicion a cumplir

• EJECUTAR

Page 13: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE nombreprocedimiento WITH EXECUTE AS CALLER

• AS BEGIN SELECT Nombre, Color, precio, fechaventa FROM productos WHERE fechaventa> ‘10/01/2005’ ORDER BY fechaventa, Nombre END GO

Page 14: SQL Server - Procedimientos Almacenados

• para ejecutar el procedimiento• abrimos una nueva consulta en Sql Server– use tu base de datos– EXEC nombreprocedimiento

Page 15: SQL Server - Procedimientos Almacenados

• aquí los valores son estáticos– si losusuarios quieren productos de otra fecha– solución• parametros de entrada

Page 16: SQL Server - Procedimientos Almacenados

Utilizar parámetros de entrada

• son marcadores de posición para los datos que necesita introducir el usuario– son variables en memoria– su contenido puede variar

– parametro para almacenar la fecha

Page 17: SQL Server - Procedimientos Almacenados

• Bases de datos – Programación – Procedimientos almacenados– en el procedimiento – boton derecho – modificar– ahora pone Alter Procedure en lugar de Create

Procedure– debemos crear un parametro• @fecha• tipo de datos [datetime]

– modificamos la consulta

Page 18: SQL Server - Procedimientos Almacenados

• ALTER PROCEDURE nombre• @fecha [datetime]• WITH…

• WHERE fecha>@fecha• …– END

Page 19: SQL Server - Procedimientos Almacenados

• ALTER PROCEDURE nombre• @pais nvarchar(15)• WITH…

• WHERE Country>@pais• …– END

Page 20: SQL Server - Procedimientos Almacenados

• exec clienteporpais ‘Spain’

Page 21: SQL Server - Procedimientos Almacenados

• Para probarlo– exec nombreprocedimiento ‘1/1/1999’

– puedes probar las fehcas que quieras• si el usuario se olvida de poner la fecha puede dar error

– solución» poner para estos casos un valor predeterminado

Page 22: SQL Server - Procedimientos Almacenados

• @fecha [datetime ] = ‘1/1/20003’

– prueba ahora poniendo y sin poner fecha

Page 23: SQL Server - Procedimientos Almacenados

• los usuarios quieren ver un conjunto de resultados, sino un calculo matemático– parametros de salida

Page 24: SQL Server - Procedimientos Almacenados

Utilizar parámetros de salida

• el procedimiento almacenado devuelve un valor para utilizarlo en futuras consultas– el parametro de salida se crea en el mismo lugar

que los parametros de entrada• entre nombre procedimiento• secciones AS de código

– pero se define con la palabra OUTPUT justo después

Page 25: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE nombreprocedimiento @primero int,

– @segundo int,– @resultado int OUTPUT

• WITH EXECUTE AS CALLER• AS

BEGIN SET NOCOUNT ON;

• SET @resultado = @primero + @segundo

• END GO

Page 26: SQL Server - Procedimientos Almacenados

• para probar el Procedimiento almacenado– debes indicar dónde se coloca el parametro de

salida

Page 27: SQL Server - Procedimientos Almacenados

• ejecutamos el codigo en consulta– DECLARE @respuesta int– EXEC nombreprocedimento anterior 10,20,

@respuesta OUTPUT– SELECT ‘la solución es ‘ , @respuesta

Page 28: SQL Server - Procedimientos Almacenados

Optimizar procedimientos almacenados

• cuando sql ejecuta una consulta por primera vez– antes la compila• analiza la consulta para ver lo que se intenta conseguir• mira las tablas, columnas que se ponen en where• plan de ejecución• lo almacena en la cache de procedimientos

– area de ram dedicado para esto– si cambiamos algo en la consulta

» recompila» pero a veces errores pq debe comenzar desde principio

Page 29: SQL Server - Procedimientos Almacenados

• Obligar a Sql a compilar de nuevo un procedimiento almacenado– crearlo con la instrucción WITH RECOMPILE• obliga a crear un nuevo plan de ejecución• cuando el procedimiento almacenado tiene parametros

de entrada que cambian dráticamente

Page 30: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE nombreprocedimiento• @fecha [datetime] = ‘1/1/2003’• WITH RECOMPILE, EXECUTE AS CALLER• AS

BEGIN SELECT Nombre, Color, precio, fechaventa FROM productos WHERE fechaventa> @fecha ORDER BY fechaventa, Nombre END GO

Page 31: SQL Server - Procedimientos Almacenados

• tb puedes dejar el procedimiento original y al ejecutar

– EXEC nombreprocedimiento WITH RECOMPILE

• permite que el procedimiento se ejecute con más rapidez

Page 32: SQL Server - Procedimientos Almacenados

Protección de procedimientos

• al crear un procedimiento– se crea una consulta almacenada en el servidor– se guardan en la tabla del sistema syscomments• en cada base de datos• se puede acceder a ellas• un usuario puede ver todo y cambiar el código

– justo el procedimiento es para que el usuario no tenga que hacer esto

– clausula WITH ENCRYPTION

Page 33: SQL Server - Procedimientos Almacenados

• Select tabla.campo, tabla.campo• from syscomments com• join sysobjects ob• on ob.id=com.id• where ob.name=‘tabla que quieras’

Page 34: SQL Server - Procedimientos Almacenados

• si ejecutamos se ve todo

Page 35: SQL Server - Procedimientos Almacenados

Para cifrarlo

• alter procedure nombre• @fecha [ datetime] = ‘1/1/2000’• WITH ENCRYPTION, EXECUTE AS CALLER• AS • BEGIN• Select tabla.campo, tabla.campo• from syscomments com• join sysobjects ob• on ob.id=com.id• where ob.name=‘tabla que quieras’

Page 36: SQL Server - Procedimientos Almacenados

• hasta aquí procedimientos almacenados definidos por el usuario

• Microsoft nos ofrece más– preestablecidos para trabajar con las tablas del

sistema• procedimientos almacenados del sistema• extendidos

Page 37: SQL Server - Procedimientos Almacenados

• Microsoft usa metadatos– info sobre objetos del servidor• tamaño fichero• permisos de un usuario…

• podemos abrir directamente las tablas de sistema y consultar o modificar estos datos– dificil leer estos datos

Page 38: SQL Server - Procedimientos Almacenados

Procedimientos almacenados del sistema

• cuando se añade una BD• se añade un registro• se crea un indice• modifica objeto del servidor– se producen cambios en las tablas del sistema– donde Sql almacena la info sobre los objetos

• los procedimientos de sistema actuan sobre las bases de datos– master– msdb

» comienzan por sp_

Page 39: SQL Server - Procedimientos Almacenados

• sp_tables– muestra objetos que se puede utilizar en la

clausula from de una consulta select– es util si hemos olvidado el nombre exacto de una

tabla o vista

Page 40: SQL Server - Procedimientos Almacenados

• procedimiento que devuelve información acerca de las tablas que pertenecen al esquema esquema1 de la base de datos tu base.

Page 41: SQL Server - Procedimientos Almacenados

• USE tu base de datos;• GO • EXEC sp_tables• @table_name = '%',• @table_owner = ‘dbo',• @table_qualifier = ‘tubase';

Page 42: SQL Server - Procedimientos Almacenados

• sp_stored_procedured– lista procedimientos almacenados listos para su

uso

Page 43: SQL Server - Procedimientos Almacenados

• USE tu base;• EXEC sp_stored_procedures;

Page 44: SQL Server - Procedimientos Almacenados

• sp_server_info– indica cómo se configuró sql server durante la

instalación– versión que se usa

Page 45: SQL Server - Procedimientos Almacenados

• sp_databases– listatodas las BO disponibles en el servidor

• sp_configure• establece opciones de configuración global para

cmabiar el comportamiento de Sql

• sp_monitor– da una instantanea de cómo funciona el servidor

Page 46: SQL Server - Procedimientos Almacenados

• USE master• EXEC sp_monitor

Page 47: SQL Server - Procedimientos Almacenados

Usar procedimientos de sistema

• en consultas– USE tu base de datos– EXEC sp_help ‘tabla elegida’– EXEC sp_monitor

Page 48: SQL Server - Procedimientos Almacenados

Procedimientos almacenados extendidos

• extienden las capacidades de Sql para que pueda hacer cosas de las que el servidor de BD no podria hacer– ejecutar un comando desde simbolo de sistema• procedimiento almacenado xp_cmdshell

– puede hacerlo

Page 49: SQL Server - Procedimientos Almacenados

• los extendidos son codigo C++ guardados en biblioteca de vinculos dinamicos (DLL) desde la que se ejecutan

• muchos de ellos se ejecutan con otros procedimientos almacenados

Page 50: SQL Server - Procedimientos Almacenados

• xp_cmdshell– ejecuta programas desde el shell de comandos– como el comando dir o md (crear directorio)

• xp_fileexist– comprobar si un fichero existe

Page 51: SQL Server - Procedimientos Almacenados

• USE tu base de datos• DECLARE @resultado int• EXEC xp_fileexist ‘c:\fichero.txt’, @resultado

OUTPUT• SELECT @resultado

• devolvera 1 o 0

Page 52: SQL Server - Procedimientos Almacenados

• xp_fixeddrives– muestra letras de unidades de discos fijos y

cuantos MB libres tienen

Page 53: SQL Server - Procedimientos Almacenados

Ejecutar procedimientos extendidos

• para obtener una lista de directorios de la unidad c

• EXEC xp_cmdshell ‘dir c:’

Page 54: SQL Server - Procedimientos Almacenados

Ejemplo

• Este ejemplo muestra el uso de xp_cmdshell en un procedimiento almacenado.

• Este ejemplo notifica a los usuarios (con net send) que se va a cerrar SQL Server, detiene el servidor (con net pause) y, después, apaga el servidor (con net stop).

Page 55: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE APAGADO10 • AS • EXEC xp_cmdshell net send /domain:SQL_USERS ''SQL Server shutting down • in 10 minutes. No more connections allowed.', no_output • EXEC xp_cmdshell 'net pause sqlserver' • WAITFOR DELAY '00:05:00' • EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down • in 5 minutes.', no_output • WAITFOR DELAY '00:04:00' • EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down • in 1 minute. Log off now.', no_output • WAITFOR DELAY '00:01:00' • EXEC xp_cmdshell 'net stop sqlserver', no_output

Page 56: SQL Server - Procedimientos Almacenados

Procedimiento permite insertar un registro a la tabla empleados pero antes verifica si existe algun empleado con el mismo nombre y apellido en ese caso lo rechaza no se toma en cuenta el campo idempleado porque es autonumerico

Page 57: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE INSERTAEMPLEADO( • @NOMBRE VARCHAR(50), • @APELLIDOS VARCHAR(50), • @CARGO VARCHAR(25), • @FECHACONTRATACION SMALLDATETIME, • @FECHANACIMIENTO SMALLDATETIME, • @DIRECCION VARCHAR(50), • @CIUDAD VARCHAR(50), • @PAIS VARCHAR(50), • @FONO VARCHAR(7)) • AS • IF (SELECT COUNT(*) FROM EMPLEADOS WHERE APELLIDOS=@APELLIDOS AND NOMBRE=@NOMBRE)>0 • BEGIN • PRINT ‘EL EMPLEADO CON ESE NOMBRE YA EXISTE’ • END • ELSE • BEGIN • INSERT INTO EMPLEADOS(APELLIDOS,NOMBRE,CARGO,FECHANACIMIENTO,FECHACONTRATACIÓN,DIRECCION, • CIUDAD,PAÍS,FONO) • VALUES(@APELLIDOS,@NOMBRE,@CARGO,@FECHANACIMIENTO,@FECHACONTRATACION,@DIRECCION,@CIUDAD, • @PAIS,@FONO) • END • GO • EXECUTE INSERTAEMPLEADO ‘sanchez’,’enrique’,’DOCENTE’,’22/09/71’,’23/09/98’,’arenal 8’,’madrid’,’españa’,’5340806’

Page 58: SQL Server - Procedimientos Almacenados

• Procedimiento que permite borrar un empleado especificando su idempleado para eliminarlo

Page 59: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE ELIMINAEMPLEADO(@IDEMPLEADO INT)

• AS • DELETE FROM EMPLEADOS WHERE

IDEMPLEADO=@IDEMPLEADO • Go • EXEC ELIMINAEMPLEADO 2

Page 60: SQL Server - Procedimientos Almacenados

• Procedimiento que permite visualizar los detalles de un pedido espècificando el numero de pedido

Page 61: SQL Server - Procedimientos Almacenados

• AS • SELECT • [DETALLES DE PEDIDOS].IDPEDIDO,PRODUCTOS.NOMBREPRODUCTO,

[DETALLES DE • PEDIDOS].PRECIOUNIDAD, • [DETALLES DE PEDIDOS].CANTIDAD, • CANTIDAD*[DETALLES DE PEDIDOS].PRECIOUNIDAD AS TOTAL • FROM [DETALLES DE PEDIDOS] INNER JOIN PRODUCTOS • ON PRODUCTOS.IDPRODUCTO=[DETALLES DE PEDIDOS].IDPRODUCTO • WHERE [DETALLES DE PEDIDOS].IDPEDIDO=@NUMPED • GO • EXEC VERDETALLES 10248

Page 62: SQL Server - Procedimientos Almacenados

• podemos crear un procedimiento para recuperar el nombre de un Cliente, cuyo código se pasa por parámetro

Page 63: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE ObtenerNombre @IDCLIENTE varchar(11) AS

• SELECT NOMBRECOMPAÑíA • FROM CLIENTES • WHERE IDCLIENTE = @IDCLIENTE

Page 64: SQL Server - Procedimientos Almacenados

• Procedimiento para obtener el número de clientes y el número de productos que tenemos en la base de datos,

Page 65: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE num_clientes_productos @clientes int OUTPUT, @Productos int OUTPUT AS

• SELECT * FROM clientes • SELECT @clientes = @@ROWCOUNT • SELECT * FROM productos • SELECT @productos = @@ROWCOUNT • RETURN (0)

Page 66: SQL Server - Procedimientos Almacenados

Explicación

• A continuación devolvemos en el parámetro @clientes el valor obtenido, utilizando @@ROWCOUNT.

• Acto seguido se realiza lo mismo para la tabla Productos. Nótese como la forma de asignar un valor a un atributo es mediante una sentencia SELECT, igualando el parámetro al valor.

• La función @@ROWCOUNT devuelve el número de filas que se han seleccionado. Es equivalente a la sentencia que aparece en el Código fuente

• SELECT COUNT(*) FROM Productos

Page 67: SQL Server - Procedimientos Almacenados

• procedimento que me diga todas las filas en la tabla clientes y productos

Page 68: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE num_clientes_productos @clientes int OUTPUT, @clientes int OUTPUT AS

• SELECT @clientes = (SELECT COUNT(*) FROM clientes)

• SELECT @productos = (SELECT COUNT(*) FROM Productos)

• RETURN (0)

Page 69: SQL Server - Procedimientos Almacenados

Ejecutar procedimiento• Para ejecutar el anterior procedimiento, seguiremos los siguientes pasos: • Declarar las variables que vamos a utilizar para llamar al procedimiento.

La sintaxis para declarar una variable es utilizar la palabra reservada DECLARE, seguido del nombre de la variable y el tipo.

• DECLARE @num_clientes int • DECLARE @num_Productos int • Ejecutar el procedimiento. La sintaxis es utilizar la palabra reservada

EXEC, seguida del nombre del procedimiento, y los parámetros, separados por comas, especificando si son de retorno.

• EXEC num_clientes_productos @num_clientes OUTPUT, @num_productos OUTPUT

• Mostrar los resultados • SELECT clientes = @num_clientes, productos = @num_productos

Page 70: SQL Server - Procedimientos Almacenados

• Modificar el procedimiento anterior para que solo liste los clientes de alemania

Page 71: SQL Server - Procedimientos Almacenados

• ALTER PROCEDURE num_clientes_productos @clientes int OUTPUT, @productos int OUTPUT AS

• SELECT @clientes = (SELECT COUNT(*) FROM clientes where pais=’alemania’)

• SELECT @productos = (SELECT COUNT(*) FROM productos where preciounidad>10)

• RETURN (0)

Page 72: SQL Server - Procedimientos Almacenados

• Eliminar el procedimento anterio

Page 73: SQL Server - Procedimientos Almacenados

• Si queremos borrar un procedimiento almacenado, ejecutaremos la sentencia DROP PROCEDURE, seguido del nombre del procedimiento. Por ejemplo, si queremos borrar el procedimiento almacenado, creado en el anterior ejemplo, escribiremos el Código fuente

• DROP PROCEDURE num_clientes_clientes

Page 74: SQL Server - Procedimientos Almacenados

• crear procedimiento que liste los clientes de un pais como parametro

• si no decimos nada, le damos un parametro predeterminado

Page 75: SQL Server - Procedimientos Almacenados

• CREATE PROCEDURE LISTARCLIENTES(@PAIS VARCHAR(25) ='ARGENTINA')

• AS • SELECT

IDCLIENTE,NOMBRECOMPAÑÍA,DIRECCIÓN,PAÍS FROM CLIENTES

• WHERE PAÍS=@PAIS