You are on page 1of 11

PROCEDIMIENTOS ALMACENADOS

Los procedimientos almacenados son mdulos o rutinas que encapsulan cdigo


para su reutilizacin. Un procedimiento almacenado puede incluir parmetros de
entrada, devolver resultados tabulares o escalares y mensajes para el cliente,
invocar instrucciones de lenguaje de definicin de datos (DDL) e instrucciones de
lenguaje de manipulacin de datos (DML), as como devolver parmetros de
salida. En SQL Server 2008 existen dos tipos de procedimientos almacenados:
Transact-SQL o CLR.

Transact-SQL

Un procedimiento almacenado Transact-SQL es una coleccin guardada de


instrucciones Transact-SQL que puede tomar y devolver los parmetros
proporcionados por el usuario. Por ejemplo, un procedimiento almacenado puede
contener las instrucciones necesarias para insertar una nueva fila en una o ms
tablas segn la informacin suministrada por la aplicacin cliente o es posible
que el procedimiento almacenado devuelva datos de la base de datos a la
aplicacin cliente.

Los procedimientos almacenados de MicrosoftSQL Server son similares a los


procedimientos de otros lenguajes de programacin en el sentido de que pueden:

Aceptar parmetros de entrada y devolver varios valores en forma de


parmetros de salida al lote o al procedimiento que realiza la llamada.
Contener instrucciones de programacin que realicen operaciones en la base
de datos, incluidas las llamadas a otros procedimientos.
Devolver un valor de estado a un lote o a un procedimiento que realiza una
llamada para indicar si la operacin se ha realizado correctamente o se han
producido errores (y el motivo de stos).

Puede utilizar la instruccin EXECUTE de Transact-SQL para ejecutar un


procedimiento almacenado. Los procedimientos almacenados difieren de las
funciones en que no devuelven valores en lugar de sus nombres ni pueden
utilizarse directamente en una expresin.

Utilizar procedimientos almacenados en SQL Server en vez de programas


Transact-SQL almacenados localmente en equipos cliente presenta las siguientes
ventajas:

Se registran en el servidor.
Pueden incluir atributos de seguridad (como permisos) y cadenas de
propiedad; adems se les pueden asociar certificados.
Los usuarios pueden disponer de permiso para ejecutar un procedimiento
almacenado sin necesidad de contar con permisos directos en los objetos a
los que se hace referencia en el procedimiento.

Mejoran la seguridad de la aplicacin.


Permiten una programacin modular.

Puede crear el procedimiento una vez y llamarlo desde el programa tantas


veces como desee. As, puede mejorar el mantenimiento de la aplicacin y
permitir que las aplicaciones tengan acceso a la base de datos de manera
uniforme.

Constituyen cdigo con nombre que permite el enlace diferido.

Esto proporciona un nivel de direccionamiento indirecto que facilita la


evolucin del cdigo.

Pueden reducir el trfico de red.

Una operacin que necesite centenares de lneas de cdigo Transact-SQL


puede realizarse mediante una sola instruccin que ejecute el cdigo en un
procedimiento, en vez de enviar cientos de lneas de cdigo por la red.

Entre las reglas para disear procedimientos almacenados se incluyen las


siguientes:

La propia definicin de CREATE PROCEDURE puede incluir cualquier nmero


y tipo de instrucciones SQL, excepto las indicadas a continuacin. No pueden
utilizarse en ninguna parte de un procedimiento almacenado.

CREATE AGGREGATE CREATE RULE

CREATE DEFAULT CREATE SCHEMA

CREATE o ALTER FUNCTION CREATE o ALTER TRIGGER

CREATE o ALTER PROCEDURE CREATE o ALTER VIEW

SET PARSEONLY SET SHOWPLAN_ALL

SET SHOWPLAN_TEXT SET SHOWPLAN_XML

USE database_name
Puede crear otros objetos de base de datos dentro de un procedimiento
almacenado. Puede hacer referencia a un objeto creado en el mismo
procedimiento almacenado, siempre que se haya creado antes de hacer
referencia a l.
Puede hacer referencia a tablas temporales dentro de un procedimiento
almacenado.
Si crea una tabla temporal local dentro de un procedimiento almacenado,
sta existir nicamente para los fines del procedimiento y desaparecer
cuando ste finalice.
Si ejecuta un procedimiento almacenado que llama a otro procedimiento
almacenado, este ltimo puede tener acceso a todos los objetos creados por
el primero, incluidas las tablas temporales.
Si ejecuta un procedimiento almacenado remoto que realiza cambios en una
instancia remota de MicrosoftSQL Server, los cambios no se pueden revertir.
Los procedimientos almacenados remotos no intervienen en las
transacciones.
El nmero mximo de parmetros en un procedimiento almacenado es de
2100.
El nmero mximo de variables locales en un procedimiento almacenado
est limitado nicamente por la memoria disponible.
En funcin de la memoria disponible, el tamao mximo de un
procedimiento almacenado es de 128 megabytes (MB).

CREATE PROCEDURE (Transact-SQL)

Crea un procedimiento almacenado Transact-SQL o Common Language Runtime


(CLR) en SQL Server 2008 R2. Los procedimientos almacenados son similares a los
procedimientos de otros lenguajes de programacin en tanto que pueden:

Aceptar parmetros de entrada y devolver varios valores en forma de


parmetros de salida al lote o al procedimiento que realiza la llamada.
Contener instrucciones de programacin que realicen operaciones en la base
de datos, incluidas las llamadas a otros procedimientos.
Devolver un valor de estado a un lote o a un procedimiento que realice una
llamada para indicar si la operacin se ha realizado correctamente o se han
producido errores, y el motivo de estos.

Sintaxis

Transact-SQL
--Transact-SQL Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]

<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]

Transact-SQL
--CLR Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
[ { @parameter [ type_schema_name. ] data_type }
[ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

Argumentos

schema_name

El nombre del esquema al que pertenece el procedimiento. Los


procedimientos se enlazan a un esquema. Si no se especifica el nombre del
esquema cuando se crea el procedimiento, se asigna automticamente el
esquema predeterminado del usuario que crea este procedimiento.

procedure_name

El nombre del procedimiento. Los nombres de los procedimientos deben


cumplir las reglas de los identificadores y deben ser exclusivos en el
esquema.

Evite el uso del prefijo sp_ cuando asigne nombre a los procedimientos. SQL
Server usa este prefijo para designar los procedimientos del sistema. Si usa
el prefijo, puede provoca la ruptura del cdigo de la aplicacin si existe un
procedimiento del sistema con el mismo nombre.

; number
Entero opcional que se usa para agrupar procedimientos con el mismo
nombre. Estos procedimientos agrupados se pueden quitar juntos
mediante una instruccin DROP PROCEDURE.

@ parameter

Parmetro declarado en el procedimiento. Especifique un nombre de


parmetro con una arroba (@) como el primer carcter. El nombre del
parmetro se debe ajustar a las reglas de los identificadores. Los
parmetros son locales respecto al procedimiento; los mismos nombres de
parmetro se pueden usar en otros procedimientos.

Se pueden declarar uno o varios parmetros; el valor mximo es 2.100. El


usuario debe proporcionar el valor de cada parmetro declarado cuando
se llame al procedimiento, a menos que se haya definido un valor
predeterminado para el parmetro o se haya establecido en el mismo valor
que el de otro parmetro. Si un procedimiento contiene parmetros con
valores de tabla y el parmetro no est en la llamada, se pasa una tabla
vaca. Los parmetros solo pueden ocupar el lugar de expresiones
constantes; no se pueden usar en lugar de nombres de tabla, nombres de
columna o nombres de otros objetos de base de datos. No se pueden
declarar los parmetros si se especifica FOR REPLICATION.

[ type_schema_name. ] data_type

El tipo de datos del parmetro y el esquema al que pertenece el tipo de


datos.

VARYING

Especifica el conjunto de resultados admitido como parmetro de salida.


Este parmetro lo crea de forma dinmica el procedimiento y su contenido
puede variar. Solo se aplica a los parmetros de tipo cursor. Esta opcin no
es vlida para los procedimientos CLR.

default

Valor predeterminado de un parmetro. Si se define un valor


predeterminado para un parmetro, el procedimiento se puede ejecutar
sin especificar ningn valor para ese parmetro. El valor predeterminado
debe ser una constante o puede ser NULL. El valor constante puede tener el
formato de un carcter comodn, lo que permite usar la palabra clave LIKE
cuando se pase el parmetro al procedimiento. Vea el ejemplo C ms
adelante.
Los valores predeterminados solo se registran en la
columna sys.parameters.default de los procedimientos CLR. Esa columna
ser NULL para los parmetros de procedimientos Transact-SQL.

OUT | OUTPUT

Indica que se trata de un parmetro de salida. Use los parmetros OUTPUT


para devolver valores al autor de la llamada del procedimiento. Los
parmetros text, ntext e image no se pueden usar como parmetros
OUTPUT, a menos que se trate de un procedimiento CLR. Un parmetro de
salida puede ser un marcador de posicin de cursor, a menos que el
procedimiento sea un procedimiento CLR. Un tipo de datos con valores de
tabla no se puede especificar como parmetro OUTPUT de un
procedimiento.

READONLY

Indica que el parmetro no se puede actualizar ni modificar en el cuerpo


del procedimiento. Si el tipo de parmetro es un tipo con valores de tabla,
se debe especificar READONLY.

RECOMPILE

Indica que Motor de base de datos no almacena en cach ningn plan de


consulta para este procedimiento, forzndolo a ser compilado cada vez que
se ejecute. Para obtener ms informacin sobre las razones para forzar
una nueva compilacin, vea Volver a compilar procedimientos
almacenados. Esta opcin no se puede usar cuando se especifica FOR
REPLICATION ni para procedimientos CLR.

Para indicar a Motor de base de datos que descarte planes de consulta para
consultas individuales en un procedimiento, use la sugerencia de consulta
RECOMPILE en la definicin de la consulta. Para obtener ms informacin,
vea Sugerencias de consulta (Transact-SQL).

ENCRYPTION

Indica que SQL Server convertir el texto original de la instruccin CREATE


PROCEDURE en un formato confuso. La salida de la ofuscacin no se ve
directamente en ninguna de las vistas de catlogo de SQL Server. Los
usuarios que no dispongan de acceso a las tablas del sistema o a los
archivos de base de datos no pueden recuperar el texto confuso. Sin
embargo, estar disponible para los usuarios con privilegios que puedan
obtener acceso a las tablas del sistema a travs del puerto DAC o
directamente a los archivos de base de datos. Adems, los usuarios que
puedan adjuntar un depurador al proceso del servidor pueden recuperar el
procedimiento descifrado de la memoria en tiempo de ejecucin. Para
obtener ms informacin acerca del acceso a los metadatos del sistema,
vea Configuracin de visibilidad de los metadatos.

Esta opcin no es vlida para los procedimientos CLR.

Los procedimientos creados mediante esta opcin no se pueden publicar


como parte de la replicacin de SQL Server.

EXECUTE AS

Especifica el contexto de seguridad en el que se ejecuta el procedimiento.

Para obtener ms informacin, vea EXECUTE AS (clusula de Transact-


SQL).

FOR REPLICATION

Especifica que el procedimiento se crea para replicacin. Por consiguiente,


no se puede ejecutar en el suscriptor. Se usa un procedimiento creado con
la opcin FOR REPLICATION como filtro de procedimiento y solo se ejecuta
durante la replicacin. No se pueden declarar los parmetros si se
especifica FOR REPLICATION. No se puede especificar FOR REPLICATION en
los procedimientos CLR. La opcin RECOMPILE se ignora en el caso de
procedimientos creados con FOR REPLICATION.

Un procedimiento FOR REPLICATION tendr un tipo de


objeto RF en sys.objects y sys.procedures.

{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }

Una o ms instrucciones Transact-SQL que comprenden el cuerpo del


procedimiento. Puede usar las palabras clave BEGIN y END opcionales para
incluir las instrucciones. Para obtener informacin, vea las secciones
Prcticas recomendadas, Comentarios generales, as como Limitaciones y
restricciones que aparecen ms adelante.

EXTERNAL NAME assembly_name.class_name.method_name

Especifica el mtodo de un ensamblado de .NET Framework para que un


procedimiento almacenado CLR haga referencia a l. El
parmetro class_name debe ser un identificador vlido de SQL Server y
debe existir como clase en el ensamblado. Si la clase tiene un nombre
completo de espacio de nombres que utiliza un punto (.) para separar las
partes del espacio de nombres, el nombre de la clase debe delimitarse
mediante parntesis ([]) o comillas (""). El mtodo especificado debe ser un
mtodo esttico de la clase.

De manera predeterminada, SQL Server no puede ejecutar cdigo CLR. Se


pueden crear, modificar y quitar objetos de bases de datos que hagan
referencia a mdulos de Common Language Runtime; sin embargo, estas
referencias no se pueden ejecutar en SQL Server hasta que se habilite
la opcin clr enabled. Para habilitar esta opcin, use sp_configure.

La ejecucin de un procedimiento almacenado extendido tiene estas


caractersticas:

La funcin de procedimiento almacenado extendido se ejecuta en el contexto


de seguridad de MicrosoftSQL Server.
La funcin de procedimiento almacenado extendido se ejecuta en el espacio
de procesos de SQL Server.
El subproceso asociado a la ejecucin del procedimiento almacenado
extendido es el mismo que se utiliza para la conexin de cliente.

El procedimiento almacenado extendido se puede ejecutar desde Transact-SQL


como un procedimiento almacenado utilizando la instruccin EXECUTE:

EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT

Parmetros

@ retval

Es un valor devuelto.

@ param1

Es un parmetro de entrada.

@ param2

Es un parmetro de entrada/salida.

TRIGGER, DISPARADOR O DESENCADENADOR


Un trigger (o desencadenador) es una clase especial de procedimiento
almacenado que se ejecuta automticamente cuando se produce un evento en el
servidor de bases de datos.

Los triggers o disparadores son objetos de la base de datos que


ejecutan acciones cuando se producen ciertos eventos (tanto DML como
DDL) (inserciones, modificaciones, borrados, creacin de tablas, etc).

SQL Server proporciona los siguientes tipos de triggers:

Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un


evento de lenguaje de manipulacin de datos (DML). Los eventos DML son
instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de
definicin de datos (DDL). Estos eventos corresponden principalmente a
instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados
procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.

Trigger DML.

Los trigger DML se ejecutan cuando un usuario intenta modificar datos


mediante un evento de lenguaje de manipulacin de datos (DML). Los eventos
DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.

La sintaxis general de un trigger es la siguiente.

CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name>

ON <Table_Name, sysname, Table_Name>

AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

-- Insert statements for trigger here

END
La primera tabla (inserted) solo est disponible en las operaciones INSERT y
UPDATE y en ella estn los valores resultantes despus de la insercin o
actualizacin. Es decir, los datos insertados. Inserted estar vaca en una
operacin DELETE.

En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, estn


los valores anteriores a la ejecucin de la actualizacin o borrado. Es decir, los
datos que sern borrados. Deleted estar vaca en una operacin INSERT.

Trigger DDL

Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje


de definicin de datos (DDL). Estos eventos corresponden principalmente a
instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados
procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.

La sintaxis general de un trigger es la siguiente.

CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety>

ON DATABASE

FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE>

AS

BEGIN

...

END

Limitaciones de los triggers.

- Solo se pueden aplicar a una tabla especfica, es decir, un trigger no sirve para
dos o ms tablas
- El trigger se crea en la base de datos que de trabajo pero desde un trigger
puedes hacer referencia a otras bases de datos.
- Un Trigger devuelve resultados al programa que lo desencadena de la misma
forma que un Stored Procedure aunque no es lo ms idneo, para impedir que una
instruccin de asignacin devuelva un resultado se puede utilizar la sentencia SET
NOCOUNT al principio del Trigger.
- Las siguientes instrucciones no se pueden utilizar en los triggers :
ALTER DATABASE CREATE DATABASE
DISK INIT DISK RESIZE
DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE
RESTORE DATABASE RESTORE LOG

You might also like