Está en la página 1de 11

PROCEDIMIENTOS ALMACENADOS

Los procedimientos almacenados son módulos o rutinas que encapsulan código


para su reutilización. Un procedimiento almacenado puede incluir parámetros de
entrada, devolver resultados tabulares o escalares y mensajes para el cliente,
invocar instrucciones de lenguaje de definición de datos (DDL) e instrucciones de
lenguaje de manipulación de datos (DML), así como devolver parámetros 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 colección guardada de


instrucciones Transact-SQL que puede tomar y devolver los parámetros
proporcionados por el usuario. Por ejemplo, un procedimiento almacenado puede
contener las instrucciones necesarias para insertar una nueva fila en una o más
tablas según la información suministrada por la aplicación cliente o es posible
que el procedimiento almacenado devuelva datos de la base de datos a la
aplicación cliente.

Los procedimientos almacenados de MicrosoftSQL Server son similares a los


procedimientos de otros lenguajes de programación en el sentido de que pueden:

 Aceptar parámetros de entrada y devolver varios valores en forma de


parámetros de salida al lote o al procedimiento que realiza la llamada.
 Contener instrucciones de programación 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 operación se ha realizado correctamente o se han
producido errores (y el motivo de éstos).

Puede utilizar la instrucción 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 expresión.

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; además 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 aplicación.


 Permiten una programación modular.

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


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

 Constituyen código con nombre que permite el enlace diferido.

Esto proporciona un nivel de direccionamiento indirecto que facilita la


evolución del código.

 Pueden reducir el tráfico de red.

Una operación que necesite centenares de líneas de código Transact-SQL


puede realizarse mediante una sola instrucción que ejecute el código en un
procedimiento, en vez de enviar cientos de líneas de código por la red.

Entre las reglas para diseñar procedimientos almacenados se incluyen las


siguientes:

 La propia definición de CREATE PROCEDURE puede incluir cualquier número


y tipo de instrucciones SQL, excepto las indicadas a continuación. 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 número máximo de parámetros en un procedimiento almacenado es de
2100.
 El número máximo de variables locales en un procedimiento almacenado
está limitado únicamente por la memoria disponible.
 En función de la memoria disponible, el tamaño máximo 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 programación en tanto que pueden:

 Aceptar parámetros de entrada y devolver varios valores en forma de


parámetros de salida al lote o al procedimiento que realiza la llamada.
 Contener instrucciones de programación 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 operación 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 automáticamente 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 código de la aplicación 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 instrucción DROP PROCEDURE.

@ parameter

Parámetro declarado en el procedimiento. Especifique un nombre de


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

Se pueden declarar uno o varios parámetros; el valor máximo es 2.100. El


usuario debe proporcionar el valor de cada parámetro declarado cuando
se llame al procedimiento, a menos que se haya definido un valor
predeterminado para el parámetro o se haya establecido en el mismo valor
que el de otro parámetro. Si un procedimiento contiene parámetros con
valores de tabla y el parámetro no está en la llamada, se pasa una tabla
vacía. Los parámetros 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 parámetros si se especifica FOR REPLICATION.

[ type_schema_name. ] data_type

El tipo de datos del parámetro y el esquema al que pertenece el tipo de


datos.

VARYING

Especifica el conjunto de resultados admitido como parámetro de salida.


Este parámetro lo crea de forma dinámica el procedimiento y su contenido
puede variar. Solo se aplica a los parámetros de tipo cursor. Esta opción no
es válida para los procedimientos CLR.

default

Valor predeterminado de un parámetro. Si se define un valor


predeterminado para un parámetro, el procedimiento se puede ejecutar
sin especificar ningún valor para ese parámetro. El valor predeterminado
debe ser una constante o puede ser NULL. El valor constante puede tener el
formato de un carácter comodín, lo que permite usar la palabra clave LIKE
cuando se pase el parámetro al procedimiento. Vea el ejemplo C más
adelante.
Los valores predeterminados solo se registran en la
columna sys.parameters.default de los procedimientos CLR. Esa columna
será NULL para los parámetros de procedimientos Transact-SQL.

OUT | OUTPUT

Indica que se trata de un parámetro de salida. Use los parámetros OUTPUT


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

READONLY

Indica que el parámetro no se puede actualizar ni modificar en el cuerpo


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

RECOMPILE

Indica que Motor de base de datos no almacena en caché ningún plan de


consulta para este procedimiento, forzándolo a ser compilado cada vez que
se ejecute. Para obtener más información sobre las razones para forzar
una nueva compilación, vea Volver a compilar procedimientos
almacenados. Esta opción 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 definición de la consulta. Para obtener más información,
vea Sugerencias de consulta (Transact-SQL).

ENCRYPTION

Indica que SQL Server convertirá el texto original de la instrucción CREATE


PROCEDURE en un formato confuso. La salida de la ofuscación no se ve
directamente en ninguna de las vistas de catálogo 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 través del puerto DAC o
directamente a los archivos de base de datos. Además, los usuarios que
puedan adjuntar un depurador al proceso del servidor pueden recuperar el
procedimiento descifrado de la memoria en tiempo de ejecución. Para
obtener más información acerca del acceso a los metadatos del sistema,
vea Configuración de visibilidad de los metadatos.

Esta opción no es válida para los procedimientos CLR.

Los procedimientos creados mediante esta opción no se pueden publicar


como parte de la replicación de SQL Server.

EXECUTE AS

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

Para obtener más información, vea EXECUTE AS (cláusula de Transact-


SQL).

FOR REPLICATION

Especifica que el procedimiento se crea para replicación. Por consiguiente,


no se puede ejecutar en el suscriptor. Se usa un procedimiento creado con
la opción FOR REPLICATION como filtro de procedimiento y solo se ejecuta
durante la replicación. No se pueden declarar los parámetros si se
especifica FOR REPLICATION. No se puede especificar FOR REPLICATION en
los procedimientos CLR. La opción 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 más instrucciones Transact-SQL que comprenden el cuerpo del


procedimiento. Puede usar las palabras clave BEGIN y END opcionales para
incluir las instrucciones. Para obtener información, vea las secciones
Prácticas recomendadas, Comentarios generales, así como Limitaciones y
restricciones que aparecen más adelante.

EXTERNAL NAME assembly_name.class_name.method_name

Especifica el método de un ensamblado de .NET Framework para que un


procedimiento almacenado CLR haga referencia a él. El
parámetro class_name debe ser un identificador válido 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 paréntesis ([]) o comillas (""). El método especificado debe ser un
método estático de la clase.

De manera predeterminada, SQL Server no puede ejecutar código CLR. Se


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

La ejecución de un procedimiento almacenado extendido tiene estas


características:

 La función de procedimiento almacenado extendido se ejecuta en el contexto


de seguridad de MicrosoftSQL Server.
 La función de procedimiento almacenado extendido se ejecuta en el espacio
de procesos de SQL Server.
 El subproceso asociado a la ejecución del procedimiento almacenado
extendido es el mismo que se utiliza para la conexión de cliente.

El procedimiento almacenado extendido se puede ejecutar desde Transact-SQL


como un procedimiento almacenado utilizando la instrucción EXECUTE:

EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT

Parámetros

@ retval

Es un valor devuelto.

@ param1

Es un parámetro de entrada.

@ param2

Es un parámetro de entrada/salida.

TRIGGER, DISPARADOR O DESENCADENADOR


Un trigger (o desencadenador) es una clase especial de procedimiento
almacenado que se ejecuta automáticamente 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, creación 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 manipulación 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
definición 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 manipulación 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 están los valores resultantes después de la inserción o
actualización. Es decir, los datos insertados. Inserted estará vacía en una
operación DELETE.

En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están


los valores anteriores a la ejecución de la actualización o borrado. Es decir, los
datos que serán borrados. Deleted estará vacía en una operación INSERT.

Trigger DDL

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


de definición 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 específica, es decir, un trigger no sirve para
dos o más 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 más idóneo, para impedir que una
instrucción de asignación 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

También podría gustarte