Professional Documents
Culture Documents
Un procedimiento almacenado es un conjunto de sentencias SQL y de control de flujo Beneficios de los procedimientos almacenados:
Simplifican la ejecucin de tareas repetitivas Corren ms rpido que las mismas instrucciones ejecutadas en forma interactiva Reducen el trfico a travs de la red Pueden capturar errores antes que ellos puedan entrar a la base de datos Establece consistencia porque ejecuta las tareas de la misma forma Permite el desarrollo modular de aplicaciones Ayuda a proveer seguridad
Triggers
Son procedimientos definidos por el usuario que se ejecutan automticamente cuando se modifica un dato en una tabla Procedimientos suministrados por el sistema
Procedimientos que hacen llamadas al sistema operativo y ejecutan tareas a ese nivel
Un procedimiento almacenado se ejecuta ms rpido que un batch porque: El procedimiento almacenado ya ha sido analizado Ya se han resuelto las referencias a los objetos referenciados en el procedimiento almacenado No se necesita construir el rbol de bsqueda, l usa el que se hace en el momento de compilarlo No se necesita crear un plan de bsqueda, porque ya el procedimiento tiene uno
Ejemplo:
create procedure ActualizarTitulos AS UPDATE titles SET price = price * $0.95 where total_sales < 3000 return
Ejemplo:
Sintaxis simplificada:
Ejemplo:
execute proc_update_titles
Ejemplo:
create procedure ActualizarPromedioTitulos AS declare @MaxVentas int, @PromMax real select @ MaxVentas = max(total_sales) from titles select @PromMax = @MaxVentas / 2 select title, total_sales from titles where total_sales < @PromMax update titles set price = price * $0.95 where total_sales < @PromMax return
Para permitir que otros usen un procedimiento almacenado, el propietario debe dar los respectivos permisos Sintaxis simplificada: grant execute on NombreProcedimiento to ListaUsuarios Ejemplo:
grant execute on ActualizarPromedioTitulos to lboy, tjovanna, vturbo
Ejecutar el procedimiento:
execute SP_Hola
Un parmetro de entrada es una variable local para el procedimiento almacenado que puede recibir un valor desde la sentencia: exec procedure
Sintaxis simplificada:
create procedure NombreProcedimiento (parameter_name datatype default_value [, parameter_name datatype default_value...] ) AS Sentencias return
Ejemplo:
create procedure InfoAutor (@lname varchar(40), @fname varchar(20)) AS -- Lista de los Libros del Autor select au_lname, au_fname, title from authors, titles, titleauthor where au_fname = @fname and au_lname = @lname and authors.au_id = titleauthor.au_id and titles.title_id = titleauthor.title_id return
Sintaxis para paso por posicin: [exec | execute] procedure_name value [, value...] Ejemplo:
exec AutorInfo "Ringer", "Albert"
Los parmetros se deben pasar en el mismo orden en que ellos aparecen en la sentencia create procedure Como este mtodo es ms propenso a errores, se aconseja el paso por nombre
Ejemplo:
exec AuthorInfo @lname = "Ringer", @fname = "Albert" au_lname --------------Ringer Ringer au_fname title ------------------Albert Is Anger the Enemy? Albert Life Without Fear
Los nombres de los parmetros en la sentencia exec deben concordar con los nombres de los parmetros usados en la sentencia create procedure Los parmetros pueden pasar en cualquier orden
Se puede asignar un valor por default a un parmetro cuando l no se indica en la sentencia execute Ejemplo:
create procedure EstadoAutores (@state char(2) = "CA") AS select au_lname, au_fname, state from authors where state = @state return
execute EstadoAutores au_lname ----------White Green ... au_fname -----------Johnson Marjorie state ----CA CA
Los valores que se pasan no tienen el mismo tipo de datos que los parmetros definidos En la misma sentencia, se pasa un parmetro por posicin despus de haber pasado un parmetro por nombre
Aunque no es recomendado, es posible mezclar los dos mtodos para pasar valores, sin embargo, despus de pasar un valor a un parmetro por nombre, todos los restantes deben pasar por nombre
create procedure InsertarVenta (@stor_idchar(4)= NULL, @ord_num varchar(20)= NULL, @date datetime= NULL) AS /* Si no se pasa la fecha, use la Fecha Actual */ if (@date is NULL) begin select @date = getdate() end begin transaction /* Insertar Ventas */ insert sales (stor_id, ord_num, date) values (@stor_id, @ord_num, @date) if @@error <> 0 begin rollback transaction raiserror 24001 "Transaccin fallada " return end commit transaction return
Ejecutar el procedimiento con y sin un valor para el parmetro de entrada. Una sentencia fallar:
exec SP_Hola exec SP_Hola "<Su Nombre>"
Crear un procedimiento almacenado que tiene un valor por default para un parmetro de entrada:
create procedure Hola (@Nombre varchar(30) = Quien quiera que seas") AS print Hola %1!", @Nombre return
El retorno de un Parmetro es una variable local a un procedimiento almacenado que puede enviar un valor a la sentencia exec procedure
Sintaxis simplificada: create procedure NombreProcedimiento (parameter_name datatype output [, parameter_name datatype output...] ) AS Sentencias return Ejemplo:
create SP_NuevoPrecio (@title_id char(6), @NuevoPrecio money output) AS select @NuevoPrecio = price from titles where title_id = @title_id select @NuevoPrecio = @NuevoPrecio * $1.15 return
Los valores que retornan los parmetros se pasan automticamente al conjunto respuesta El retorno de valores se pueden pasar por nombre o por posicin
Se recomienda el paso por nombre
Un plan de bsqueda es un conjunto ordenado de etapas que se requieren para acceder los datos, incluyendo informacin sobre:
Si usar o no un ndice El ndice a usar El orden en el cual las tablas se deben encadenar
El plan de bsqueda creado para la ejecucin de un procedimiento almacenado puede que no sea el plan de bsqueda ptimo para la siguiente ejecucin del procedimiento almacenado
Las dos ejecuciones pueden usar parmetros de entrada muy diferentes Se pueden haber aadido nuevos ndices entre las dos ejecuciones El tamao de las tablas accedidas pueden haber cambiado significativamente entre las dos ejecuciones
Hay tres formas para forzar al servidor a generar un nuevo plan de bsqueda
Usar with recompile en el procedimiento Usar with recompile cuando se ejecute el procedimiento Usar sp_recompile
En un procedimiento, usar la opcin with recompile para forzar al servidor a crear un nuevo plan de bsqueda cada vez que se ejecute el procedimiento Sintaxis simplificada: create procedure NombreProcedimiento with recompile AS
return
Sentencias
Ejemplo:
create procedure SP_lista_AutoresCalifornia (@Nombre varchar(80), @Apellidos varchar(80)) with recompile AS select au_id, au_lname, au_fname from authors where au_lname between @Nombre and @Apellidos and state = "CA" order by au_lname return
Cuando se ejecute un procedimiento almacenado, usar la opcin with recompile para forzar al servidor a crear un nuevo plan de bsqueda para esa ejecucin del procedimiento Esta opcin se puede usar cuando se ejecuta cualquier procedimiento almacenado Sintaxis simplificada: [exec | execute] NombreProcedimiento with recompile Ejemplo:
execute ActualizarTitulos with recompile
sp_recompile hace que cada procedimiento almacenado (y trigger) que utilice la tabla indicada se recompile la siguiente vez que l se ejecute Sintaxis: sp_recompile NombreTabla Ejemplo:
sp_recompile authors