Sei sulla pagina 1di 26

Definicin de procedimiento almacenado

Los procedimientos almacenados son grupos formados por instrucciones SQL y el lenguaje de control de flujo. Cuando se ejecuta un procedimiento, se prepara un plan de ejecucin para que la subsiguiente ejecucin sea muy rpida. Los procedimientos almacenados pueden:

Incluir parmetros Llamar a otros procedimientos Devolver un valor de estado a un procedimiento de llamada o lote para indicar el xito o el fracaso del mismo y la razn de dicho fallo Devolver valores de parmetros a un procedimiento de llamada o lote Ejecutarse en SQL Server remotos

La posibilidad de escribir procedimientos almacenados mejora notablemente la potencia, eficacia y flexibilidad de SQL. Los procedimientos compilados mejoran la ejecucin de las instrucciones y lotes de SQL de forma dramtica. Adems, los procedimientos almacenados pueden ejecutarse en otros SQL Server si el servidor del usuario y el remoto estn configurados para permitir logins remotos. Escriba disparadores en su SQL Server local que ejecuten procedimientos en un servidor remoto siempre que determinados eventos, como las eliminaciones, actualizaciones o inserciones, tengan lugar a nivel local. Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de los lotes de instrucciones SQL en que estn precompilados. La primera vez que se ejecuta un procedimiento, el procesador de consultas de SQL Serverlo analiza y prepara un plan de ejecucin que se almacena de forma definitiva en una tabla del sistema . Posteriormente, el procedimiento se ejecuta segn el plan almacenado. Puesto que ya se ha realizado la mayor parte del trabajo de procesamiento de consultas, los procedimientos almacenados se ejecutan casi de forma instantnea. SQL Server proporciona una gran variedad de procedimientos almacenados como herramientas adecuadas para el usuario. Estos procedimientos almacenados se llaman procedimientos del sistema. Los procedimientos almacenados se crean con create procedure . Para ejecutar un procedimiento almacenado, ya sea un procedimiento del sistema o uno definido por el usuario, use el comando execute . Tambin puede utilizar el nombre del procedimiento almacenado solo, siempre que sea la primera palabra de una instruccin o lote. Ejemplos de creacin y uso de procedimientos almacenados La sintaxis para la creacin de un procedimiento almacenado sencillo, sin funciones especiales como parmetros, es:
create procedure procedure_name as SQL_statements

Los procedimientos almacenados son objetos de base de datos, y sus nombres deben ajustarse a las reglas para identificadores. Es posible incluir cualquier nmero y cualquier tipo de instruccin SQL, salvo las instrucciones create . Consulte "Reglas asociadas a procedimientos almacenados". Un procedimiento puede ser tan sencillo como una sola instruccin que enumere los nombres de todos los usuarios de una base de datos:
create procedure namelist as select name from sysusers

Para ejecutar un procedimiento almacenado, emplee la palabra clave execute y el nombre del procedimiento almacenado, o simplemente especifique el nombre del procedimiento, siempre que se enve a SQL Server solo o sea la primera instruccin de un lote. Puede ejecutar namelist de cualquiera de las siguientes formas:
namelist execute namelist exec namelist

Para ejecutar un procedimiento almacenado en un SQL Server remoto, debe proporcionar el nombre del servidor. La sintaxis completa de una llamada de procedimiento remoto es:
execute server_name .[ database_name ].[ owner ]. procedure_name

Los siguientes ejemplos ejecutan el procedimiento namelist en la base de datos pubs2 en el servidor GATEWAY:
execute gateway.pubs2..namelist gateway.pubs2.dbo.namelist exec gateway...namelist

El ltimo ejemplo slo funciona si pubs 2 es la base de datos predeterminada del usuario. El nombre de la base de datos es opcional slo si el procedimiento almacenado se encuentra en la base de datos predeterminada del usuario. El nombre del propietario es opcional slo si el propietario de la base de datos ( " dbo " ) es el propietario del procedimiento o si el usuario lo posee. Lgicamente, es necesario tener permiso para ejecutar el procedimiento. Un procedimiento puede incluir ms de una instruccin.
create select select select procedure showall as count(*) from sysusers count(*) from sysobjects count(*) from syscolumns

Cuando se ejecuta el procedimiento, los resultados de cada comando se muestran en el orden en que la instruccin aparece en el procedimiento.

showall -----------5 (1 row affected) -----------88 (1 row affected) -----------349 (1 row affected, return status = 0)

Cuando el comando create procedure se ejecuta de forma correcta, el nombre del procedimiento se almacena en sysobjects y su texto en syscomments . Se puede mostrar el texto de un procedimiento con el procedimiento del sistema sp_helptext :
sp_helptext showall # Lines of Text --------------1 (1 row affected) text ---------------------------------------create procedure showall as select count(*) from sysusers select count(*) from sysobjects select count(*) from syscolumns (1 row affected, return status = 0)

Procedimientos almacenados y permisos Los procedimientos almacenados pueden servir de mecanismos de seguridad, ya que un usuario puede recibir el permiso para ejecutar un procedimiento almacenado aunque no tenga permisos en las tablas o vistas referenciadas en el mismo ni permiso para ejecutar comandos especficos. Para obtener ms detalles, consulte la Gua del Usuario de las Caractersticas de Seguridad . Procedimientos almacenados y rendimiento Conforme cambia la base de datos, los planes de consulta originales utilizados para acceder a sus tablas pueden volver a optimizarse recompilndolos con el procedimiento del sistema sp_recompile . Esto evitar tener que buscar, omitir y volver a crear cada procedimiento almacenado y disparador. El siguiente ejemplo marca cada procedimiento almacenado y disparador que accede a la tabla titles para que se recompile la prxima vez que se ejecute.
sp_recompile titles

Creacin y ejecucin de procedimientos almacenados


La sintaxis completa de create procedure es:
create procedure [owner.]procedure_name[;number] [[ (]@parameter_name datatype [= default] [output] [, @parameter_name datatype [= default] [output]]...[)]] [with recompile] as sql_statements

Slo se puede crear un procedimiento en la base de datos actual. El permiso para emitir create procedure est asignado de forma predeterminada al propietario de la base de datos, que puede transferirlo a otros usuarios. A continuacin se muestra la instruccin de sintaxis completa de execute :
[execute] [@return_status = ] [[[ server .] database .] owner .] procedure_name [; number ]

[[@ parameter_name =] value | [@ parameter_name =] @ variable [output] [,[@ parameter_name =] value | [@ parameter_name =] @ variable [output]...]] [with recompile]

Note: Las llamadas de procedimientos remotos no se consideran parte de una transaccin. Si ejecuta una llamada de procedimientos remotos despus de begin transaction y luego usa rollback transaction , los cambios realizados por la llamada en los datos remotos no se revierten. El diseador del procedimiento almacenado debe asegurarse de que se comprueban todas las condiciones que puedan originar una reversin antes de ejecutar una llamada de procedimientos remotos que altere los datos remotos. Parmetros Un parmetro es un argumento de un procedimiento almacenado. Es posible declarar uno o ms parmetros de forma opcional en una instruccin create procedure . El usuario debe suministrar el valor de cada parmetro indicado en una instruccin create procedure al ejecutarse el procedimiento. Los nombres de los parmetros deben estar precedidos del smbolo "@" y ajustarse a las reglas para identificadores. Es necesario asignarles un tipo de datos del sistema o uno definido por el usuario, y una longitud si es necesario para el tipo de datos. Los nombres de los parmetros son locales para el procedimiento que los crea; los mismos nombres de parmetros pueden utilizarse en otros procedimientos. Los nombres de parmetro, incluido el smbolo "@", pueden tener una longitud mxima de 30 bytes. A continuacin se muestra un procedimiento almacenado que resulta til en la base de datos pubs2 . Dado el apellido y nombre de un autor, el procedimiento muestra los nombres de los libros escritos por la persona en cuestin, as como el editor de cada libro.

create proc au_info @lastname varchar(40), @firstname varchar(20) as select au_lname, au_fname, title, pub_name from authors, titles, publishers, titleauthor where au_fname = @firstname and au_lname = @lastname and authors.au_id = titleauthor.au_id and titles.title_id = titleauthor.title_id and titles.pub_id = publishers.pub_id

Ahora ejecute au_info :


au_info Ringer, Anne au_lname au_fname title pub_name -------- -------- --------------------- ---------Ringer Anne The Gourmet Microwave Binnet & Hardley Ringer Anne Is Anger the Enemy? New Age Books (2 rows affected, return status = 0)

El siguiente procedimiento almacenado consulta las tablas del sistema. Dado un nombre de tabla como parmetro, el procedimiento muestra el nombre de la tabla, el nombre del ndice y la ID del ndice.
create proc showind @table varchar(30) as select table_name = sysobjects.name, index_name = sysindexes.name, index_id = indid from sysindexes, sysobjects where sysobjects.name = @table and sysobjects.id = sysindexes.id

Los encabezados de columna, por ejemplo , table_name , se aadieron para facilitar la lectura de los resultados. A continuacin se muestran los formatos de sintaxis aceptables para la ejecucin de este procedimiento almacenado:
execute showind titles exec showind titles execute showind @table = titles execute GATEWAY.pubs2.dbo.showind titles showind titles

El ltimo formato de sintaxis, sin exec ni execute , es aceptable siempre que la instruccin sea la nica o la primera de un lote. A continuacin se muestran los resultados de ejecutar showind en la base de datos pubs2 con titles como parmetro:
table_name ---------titles titles index_name ---------titleidind titleind index_id ---------1 2

(2 rows affected, return status = 0)

Note: Si proporciona los parmetros con el formato "@ parameter = value ", puede especificarlos en cualquier orden. En caso contrario, debe proporcionar los parmetros en el orden de su instruccin create procedure . Si suministra un valor con el formato "@ parameter = value ", todos los parmetros subsiguientes han de suministrarse de este modo. Parmetros predeterminados Se puede asignar un valor predeterminado al parmetro de la instruccin create procedure . Este valor, que puede ser cualquier constante, se toma como el argumento del procedimiento si el usuario no proporciona ninguno. A continuacin se muestra un procedimiento que muestra los nombres de todos los autores que han escrito un libro publicado por el editor introducido como parmetro. Si no se proporciona ningn nombre de editor, el procedimiento muestra los autores publicados por Algodata Infosystems.
create proc pub_info @pubname varchar(40) = "Algodata Infosystems" as select au_lname, au_fname, pub_name from authors a, publishers p, titles t, titleauthor ta where @pubname = p.pub_name and a.au_id = ta.au_id and t.title_id = ta.title_id and t.pub_id = p.pub_id

Tenga en cuenta que si el valor predeterminado es una cadena de caracteres que contiene espacios en blanco o signos de puntuacin incrustados, es necesario incluirlo entre comillas simples o dobles. Cuando ejecuta pub_info , puede proporcionar cualquier nombre de editor como valor del parmetro. Si no suministra ningn parmetro, SQL Server utiliza el predeterminado, Algodata Infosystems.
exec pub_info au_lname au_fname pub_name -------------- ------------ -------------------Green Marjorie Algodata Infosystems Bennet O'Leary MacFeather Straight Carson Dull Hunter Abraham Michael Stearns Dick Cheryl Ann Sheryl Algodata Algodata Algodata Algodata Infosystems Infosystems Infosystems Infosystems

Algodata Infosystems Algodata Infosystems Algodata Infosystems

Locksley

Chastity

Algodata

Infosystems

(9 rows affected, return status = 0)

En este procedimiento, showind2 , se asigna "titles" como valor predeterminado del parmetro @ table :
create proc showind2 @table varchar(30) = titles as select table_name = sysobjects.name, index_name = sysindexes.name, index_id = indid from sysindexes, sysobjects where sysobjects.name = @table and sysobjects.id = sysindexes.id

Los encabezados de columna, por ejemplo , table_name , clarifican la presentacin de los resultados. A continuacin se indica lo que el procedimiento muestra para la tabla authors :
showind2 authors table_name index_name index_id ----------- ---------------------authors auidind 1 authors aunmind 2 (2 rows affected, return status = 0)

Si el usuario no proporciona ningn valor, SQL Server utiliza el valor predeterminado, titles .
showind2 table_name index_name index_id ----------- ----------- --------titles titleidind 1 titles titleind 2 (2 rows affected, return status =0)

Si se espera un parmetro, pero no se suministra ninguno y no se proporciona ningn valor en la instruccin create procedure , SQL Server muestra un mensaje de error con los parmetros que espera el procedimiento. NULL como parmetro predeterminado El valor predeterminado puede ser el valor NULL. En este caso, si el usuario no suministra ningn parmetro, SQL Server ejecuta el procedimiento almacenado sin mostrar ningn mensaje de error. La definicin del procedimiento puede especificar una accin para llevarse a cabo si el usuario no proporciona ningn parmetro verificando si el valor del parmetro es nulo. A continuacin se muestra un ejemplo:

create procedure showind3 @table varchar(30) = null as if @table is null print "Please give a table name" else select table_name = sysobjects.name, index_name = sysindexes.name, index_id = indid from sysindexes, sysobjects where sysobjects.name = @table and sysobjects.id = sysindexes.id

Si el usuario no proporciona ningn parmetro, SQL Server imprime el mensaje del procedimiento en la pantalla. Para otros ejemplos de definicin del valor predeterminado como NULL, examine el texto de los procedimientos del sistema utilizando sp_helptext . Caracteres comodn en el parmetro predeterminado El valor predeterminado puede incluir los caracteres comodn (%, _, [] y [^]) si el procedimiento utiliza el parmetro con la palabra clave like . Por ejemplo, showind puede modificarse para mostrar informacin sobre las tablas del sistema si el usuario no proporciona ningn parmetro, como se muestra a continuacin:
create procedure showind4 @table varchar(30)="sys%" as select table_name = sysobjects.name, index_name = sysindexes.name, index_id = indid from sysindexes, sysobjects where sysobjects.name like @table and sysobjects.id = sysindexes.id

Uso de ms de un parmetro A continuacin se muestra una variante del procedimiento almacenado au_info que tiene valores predeterminados con caracteres comodn para ambos parmetros:
create proc au_info2 @lastname varchar(30) = "D%", @firstname varchar(18) = "%" as select au_lname, au_fname, title, pub_name from authors, titles, publishers, titleauthor where au_fname like @firstname and au_lname like @lastname and authors.au_id = titleauthor.au_id and titles.title_id = titleauthor.title_id and titles.pub_id = publishers.pub_id

Si au_info2 se ejecuta sin parmetros, se muestran todos los autores cuyos apellidos comienzan por "D":

au_info2 au_lname au_fname -------- ------Dull Ann DeFrance Michel (2 rows affected)

title ------------------------Secrets of Silicon Valley The Gourmet Microwave

pub_name ------------Algodata Infosystems Binnet & Hardley

Si hay valores predeterminados disponibles para parmetros, stos pueden omitirse en la ejecucin, comenzando por el ltimo parmetro. No puede saltarse un parmetro a menos que NULL sea su valor predeterminado suministrado. Note: Si proporciona los parmetros en el formato " @parameter = value ", puede suministrarlos en cualquier orden. Tambin puede omitir un parmetro para el que se ha suministrado un valor predeterminado. Si proporciona un valor en el formato " @parameter = value ", todos los parmetros subsiguientes tambin debern suministrarse de este modo. Como ejemplo de omisin del segundo parmetro cuando se han definido valores predeterminados para dos parmetros, puede buscar los libros y editores de todos los autores cuyo apellido es "Ringer", de la siguiente manera:
au_info2 Ringer au_lname au_fname --------------Ringer Anne Ringer Anne Ringer Albert Ringer Albert (4 rows affected) title --------------------The Gourmet Microwave Is Anger the Enemy? Is Anger the Enemy? Life Without Fear Pub_name -----------Binnet & Hardley New Age Books New Age Books New Age Books

Grupos de procedimientos El punto y coma (;) y el nmero entero opcionales despus del nombre del procedimiento en las instrucciones create procedure y execute permiten agrupar los procedimientos que tienen el mismo nombre para que puedan omitirse juntos mediante un solo comando drop procedure . Los procedimientos utilizados en la misma aplicacin suelen agruparse de este modo. Por ejemplo, podra crear una serie de procedimientos llamados orders;1 , orders;2 , etc.. La siguiente instruccin omitira el grupo completo:
drop proc orders

Una vez agrupados los procedimientos mediante el anexo de un punto y coma (;) y un nmero a sus nombres, no es posible omitirlos de forma individual. Por ejemplo, no se permite la siguiente instruccin:
drop proc orders;2

with recompile en create procedure En la instruccin create procedure , la clusula opcional with recompile aparece justo antes de las instrucciones SQL. Esto indica a SQL Server que no guarde ningn plan para este procedimiento. Cada vez que se ejecuta el procedimiento se crea un plan nuevo. Si no se usa with recompile , SQL Server almacena el plan de ejecucin que crea. Generalmente, este plan de ejecucin es correcto. Sin embargo, es posible que un cambio en los datos o un cambio en los valores de parmetro suministrados para las ejecuciones subsiguientes haga que SQL Server proponga un plan de ejecucin distinto del que cre la primera vez que se ejecut el procedimiento. En estas situaciones, SQL Server necesita un plan de ejecucin nuevo. Use with recompile en una instruccin create procedure cuando crea que necesita un plan nuevo. Consulte el Manual de Referencia de SQL Server para obtener ms informacin. with recompile en execute En la instruccin execute , la clusula opcional with recompile aparece despus de cualquier parmetro. Esto indica a SQL Server que compile un plan nuevo. El plan nuevo se utiliza para ejecuciones subsiguientes. Use with recompile cuando ejecute un procedimiento si los datos han sufrido un gran cambio o si el parmetro que proporciona es atpico, es decir, si tiene alguna razn para creer que el plan almacenado con el procedimiento podra no ser ptimo para la ejecucin de ste. Note: Si utiliza select * en la instruccin create procedure , el procedimiento, aunque use la opcin with recompile de execute , no toma ninguna columna nueva aadida a la tabla. Es necesario omitir el procedimiento y volver a crearlo. Anidacin de procedimientos dentro de procedimientos La anidacin tiene lugar cuando un procedimiento almacenado o un disparador llama a otro. El nivel de anidacin se incrementa cuando el procedimiento o disparador llamado inicia la ejecucin y disminuye cuando el procedimiento o disparador llamado finaliza la ejecucin. Si se supera el mximo de 16 niveles de anidacin, el procedimiento no se ejecuta correctamente. El nivel de anidacin actual se almacena en la variable global @@nestlevel . Uso de tablas temporales en procedimientos almacenados Es posible crear y utilizar tablas temporales en un procedimiento almacenado, pero la tabla temporal slo existe mientras dura el procedimiento almacenado que la crea. Cuando el

procedimiento finaliza, SQL Server omite la tabla temporal de forma automtica. Un solo procedimiento puede:

Crear una tabla temporal Insertar, actualizar o eliminar datos Ejecutar consultas en la tabla temporal Llamar a otros procedimientos que hacen referencia a la tabla temporal

Dado que la tabla temporal tiene que existir para poder crear procedimientos que hagan referencia a ella, a continuacin se indican los pasos que debe seguir:
1. Cree la tabla temporal que precisa con una instruccin create table o una select

into . Por ejemplo:


create table #tempstores (stor_id char(4), amount money)

2. Cree los procedimientos que accedan a la tabla temporal (pero no el que la genera).
create procedure inv_amounts as select stor_id, "Total Due" =sum(amount) from #tempstores group by stor_id

3. Omita la tabla temporal:


drop table #tempstores

4. Cree el procedimiento que genera la tabla y llama a los procedimientos creados en el paso 2:
create procedure inv_proc as create table #tempstores (stor_id char(4), amount money) insert #tempstores select stor_id, sum(qty*(100-discount)/100*price) from salesdetail, titles where salesdetail.title_id = titles.title_id group by stor_id, salesdetail.title_id exec inv_amounts

Tambin puede crear tablas temporales sin el prefijo #, utilizando create table tempdb..tablename... desde dentro de un procedimiento almacenado. Estas tablas no desaparecen cuando finaliza el procedimiento, de modo que es posible hacer referencia a ellas mediante procedimientos independientes. Siga los pasos descritos anteriormente para crear estas tablas.

Ejecucin de procedimientos de forma remota Es posible ejecutar procedimientos en otro SQL Server desde el SQL Server local. Una vez configurados ambos servidores de forma adecuada, puede ejecutar cualquier procedimiento en el SQL Server remoto con slo usar el nombre del servidor como parte del identificador. Por ejemplo, para ejecutar un procedimiento llamado remoteproc en un servidor denominado GATEWAY:
exec gateway.remotedb.dbo.remoteproc

Consulte la Gua de Administracin del Sistema para obtener informacin sobre cmo configurar los SQL Server local y remoto para la ejecucin remota de procedimientos. Es posible pasar uno o ms valores como parmetros a un procedimiento remoto desde el lote o el procedimiento que contiene la instruccin execute para el procedimiento remoto. Los resultados del SQL Server remoto aparecen en el terminal local. El estado de retorno de los procedimientos, descritos en las secciones siguientes, puede utilizarse para capturar y transmitir mensajes de informacin sobre el estado de ejecucin de los procedimientos. Warning! Las llamadas de procedimientos remotos no se consideran parte de una transaccin. En consecuencia, si ejecuta una llamada de procedimientos remotos como parte de una transaccin y luego revierte la transaccin, los cambios realizados por la llamada en un SQL Server remoto no se revierten.

Obtencin de informacin a partir de procedimientos almacenados


Los procedimientos almacenados muestran un "estado de retorno" que indica si se han ejecutado correctamente o, en caso contrario, las razones del fallo. Este valor puede almacenarse en una variable cuando se llama a un procedimiento y utilizarse en futuras instrucciones Transact-SQL. Los valores del estado de retorno definidos por SQL Server para fallos se encuentran en la escala de -1 a -99; los usuarios pueden definir sus propios valores de estado de retorno fuera de esta escala. Otra forma en la que los procedimientos almacenados pueden devolver informacin al solicitante es mediante los parmetros de retorno. Los parmetros designados como parmetros de retorno en las instrucciones create procedure y execute informan sobre los valores de parmetro al solicitante. Despus el solicitante puede utilizar instrucciones condicionales para verificar el valor devuelto. El estado de retorno y los parmetros de retorno permiten modularizar los procedimientos almacenados. Un conjunto de instrucciones SQL usadas por varios procedimientos almacenados puede crearse como un solo procedimiento que devuelve su estado de ejecucin o los valores de sus parmetros al procedimiento de llamada. Por ejemplo, muchos de los procedimientos del sistema suministrados por SQL Server ejecutan un procedimiento que verifica que determinados parmetros son identificadores vlidos.

Las llamadas de procedimientos remotos, que son procedimientos almacenados ejecutados en un SQL Server remoto, tambin devuelven ambos tipos de informacin. Todos los ejemplos que se muestran ms abajo se podran ejecutar de forma remota si la sintaxis de la instruccin execute incluyese el servidor, la base de datos y los nombres de los propietarios, as como el nombre del procedimiento. Estado de retorno Los procedimientos almacenados pueden devolver un valor entero llamado estado de retorno . Este estado indica que el procedimiento se ha realizado correctamente, o indica la razn del fallo. SQL Server tiene un conjunto definido de valores de retorno. Los usuarios tambin pueden definir sus propios valores de retorno. A continuacin se muestra un ejemplo de un lote que utiliza el formato de la instruccin execute que devuelve el estado:
declare @status int execute @status = pub_info select @status

El estado de ejecucin del procedimiento pub_info se almacena en la variable @ status . Este ejemplo solamente imprime el valor con una instruccin select ; ejemplos posteriores utilizan este valor de retorno en clusulas condicionales. Valores de estado de retorno reservados SQL Server reserva el 0 para indicar un retorno correcto y los valores negativos entre -1 y -99 para indicar diferentes razones de fallo. Los nmeros 0 y -1 a -14 estn en uso: Tabla 14-1: Valores de estado de retorno reservados Valor Significado 0 Procedimiento ejecutado sin error -1 Falta objeto -2 Error de tipo de datos -3 Se eligi un proceso como vctima de un bloqueo insoluble -4 Error de permiso -5 Error de sintaxis -6 Errores de usuario diversos -7 Error de recursos, como espacio insuficiente -8 Problema interno no fatal -9 Se ha alcanzado el lmite del sistema -10 Inconsistencia interna fatal -11 Inconsistencia interna fatal -12 La tabla o el ndice estn corrutpos

-13 -14

La base de datos est corrupta Error de hardware

Los valores entre -15 y -99 estn reservados para su uso futuro por parte de SQL Server. Si se produce ms de un error durante la ejecucin, se devolver el estado que tenga el valor absoluto ms alto. Valores de retorno generados por el usuario El usuario puede generar sus propios valores de retorno en procedimientos almacenados aadiendo un parmetro a la instruccin return . Los nmeros entre 0 y -99 estn reservados para su uso por parte de SQL Server; pueden utilizarse todos los dems nmeros enteros. El siguiente ejemplo devuelve 1 cuando un libro tiene un contrato vlido y 2 en todos los dems casos:
create proc checkcontract @titleid tid as if (select contract from titles where title_id = @titleid) = 1 return 1 else return 2

El siguiente procedimiento almacenado llama a checkcontract y utiliza clusulas condicionales para verificar el estado de retorno:
create proc get_au_stat @titleid tid as declare @retvalue int execute @retvalue = checkcontract @titleid if (@retvalue = 1) print "Contract is valid" else print "There is not a valid contract"

A continuacin se muestran los resultados de ejecutar get_au_stat con la title_id de un libro con un contrato vlido:
get_au_stat "MC2222" Contract is valid

Verificacin de roles en procedimientos Si un procedimiento almacenado realiza tareas relacionadas con la administracin del sistema o la seguridad, es posible que desee asegurarse de que slo los usuarios con un rol especfico puedan ejecutarlo (consulte la Gua del Usuario de las Caractersticas de Seguridad para obtener informacin sobre roles). La funcin proc_role permite verificar

los roles cuando se ejecuta el procedimiento. proc_role devuelve 1 si el usuario posee el rol especificado. Los nombres de rol son sa_role, sso_role y oper_role . A continuacin se muestra un ejemplo que utiliza proc_role en el procedimiento almacenado test_proc para que la persona solicitante sea el administrador del sistema:
create proc test_proc as if (proc_role("sa_role") = 0) begin print "You don't have the right role" return -1 end else print "You have SA role" return 0

Parmetros de retorno Cuando las instrucciones create procedure y execute incluyen la opcin output con un nombre de parmetro, el procedimiento devuelve un valor al solicitante, que puede ser un lote SQL u otro procedimiento almacenado. El valor devuelto puede utilizarse en instrucciones adicionales en el lote o el procedimiento de llamada. Cuando se usan parmetros de retorno en una instruccin execute que forma parte de un lote, los valores de retorno se imprimen con un encabezado antes de que se ejecuten las instrucciones subsiguientes del lote. Este procedimiento almacenado realiza la multiplicacin con dos valores enteros. El tercer valor entero, @ result , se define como un parmetro output :
create procedure mathtutor @mult1 int, @mult2 int, @result int output as select @result = @mult1 * @mult2

Para utilizar mathtutor a fin de poner en cifras un problema de multiplicacin, debe declarar la variable @result e incluirla en la instruccin execute . La adicin de la palabra clave output a la instruccin execute muestra el valor de los parmetros de retorno.
declare @result int exec mathtutor 5, 6, @result output (return status = 0) Return parameters: ----------30

Si quisiera adivinar la respuesta y ejecutar este procedimiento proporcionando tres valores enteros, no vera los resultados de la multiplicacin. La instruccin select del procedimiento asigna valores, pero no imprime:
mathtutor 5, 6, 32 (return status = 0)

El valor del parmetro output debe pasarse como una variable, no como una constante. Este ejemplo declara la variable @ guess para almacenar el valor que debe pasarse a mathtutor para su uso en @ result . SQL Server imprime los parmetros de retorno:
declare @guess int select @guess = 32 exec mathtutor 5, 6, @result = @guess output (1 row affected) (return status = 0) Return parameters: @result ----------30

El valor del parmetro de retorno siempre se indica, tanto si ha cambiado su valor como si no. Tenga en cuenta que:

En el ejemplo anterior, el parmetro output @ result debe pasarse como "@ parameter = @ variable ". Si no fuera el ltimo parmetro pasado, los parmetros subsiguientes tendran que pasarse como "@ parameter = value ". @ result no tiene que declararse en el lote de llamada; es el nombre de un parmetro que ha de pasarse a mathtutor . Aunque el valor cambiado de @ result se devuelve al solicitante en la variable asignada en la instruccin execute , en este caso @ guess , se muestra bajo su propio encabezado, es decir, @ result .

Si quiere utilizar el valor inicial de @ guess en clusulas condicionales despus de la instruccin execute , debe almacenarlo en otro nombre de variable durante la llamada al procedimiento. El siguiente ejemplo ilustra los ltimos dos puntos utilizando @ store para mantener el valor de la variable durante la ejecucin del procedimiento almacenado y empleando el "nuevo" valor devuelto de @ guess en clusulas condicionales:
declare @guess int declare @store int select @guess = 32 select @store = @guess execute mathtutor 5, 6, @result = @guess output select Your_answer = @store, Right_answer = @guess if @guess = @store print "Right-o" else print "Wrong, wrong, wrong!"

(1 row affected) (1 row affected) (return status = 0) Return parameters: @result ----------30 Your_answer Right_answer ----------- -----------32 30 (1 row affected) Wrong, wrong, wrong!

A continuacin se muestra un procedimiento almacenado que verifica si las nuevas ventas de libros haran que el porcentaje de derechos de autor de un autor cambiase. El parmetro @ pc est definido como un parmetro output :
create proc roy_check @title tid, @newsales int, @pc int output as declare @newtotal int select @newtotal = (select titles.total_sales + @newsales from titles where title_id = @title) select @pc = royalty from roysched where @newtotal >= roysched.lorange and @newtotal < roysched.hirange and roysched.title_id = @title

El siguiente lote SQL llama al procedimiento roy_check , despus de asignar un valor a la variable percent . Los parmetros de retorno se imprimen antes de que se ejecute la siguiente instruccin del lote:
declare @percent int select @percent = 10 execute roy_check "BU1032", 1050, @pc = @percent output select Percent = @percent go (1 row affected) (return status = 0) Return parameters: @pc ----------12 Percent ----------12 (1 row affected)

El siguiente procedimiento almacenado llama al procedimiento roy_check y utiliza el valor de retorno para percent en una clusula condicional:
create proc newsales @title tid, @newsales int as declare @percent int declare @stor_pc int select @percent = (select royalty from roysched, titles where roysched.title_id = @title and total_sales >= roysched.lorange and total_sales < roysched.hirange and roysched.title_id=titles.title_id) select @stor_pc = @percent execute roy_check @title, @newsales, @pc = @percent output if @stor_pc != @percent begin print "Royalty is changed" select Percent = @percent end else print "Royalty is the same"

Si ejecuta este procedimiento almacenado con los mismos parmetros utilizados en el lote anterior, ver estos resultados:
execute newsales "BU1032", 1050 Royalty is changed Percent ----------12 (1 row affected, return status = 0)

En los dos ejemplos anteriores que llaman a roy_check , @ pc es el nombre del parmetro que se pasa a roy_check y @percent es la variable que contiene la salida. Cuando el procedimiento almacenado newsales ejecuta roy_check , el valor devuelto en @percent puede cambiar dependiendo de los otros parmetros que se pasen. Si quiere comparar el valor devuelto de percent con el valor inicial de @ pc , debe almacenar el valor inicial en otra variable. El ejemplo anterior lo guard en stor_pc . Pase de valores en parmetros Los valores pasados en los parmetros deben tener este formato:
@ parameter = @ variable

No pueden pasarse constantes; debe existir un nombre de variable que "reciba" el valor de retorno. Los parmetros pueden ser de cualquier tipo de datos de SQL Server, excepto text e image .

Note: Si el procedimiento almacenado requiere varios parmetros, pase el parmetro del valor de retorno en ltimo lugar en la instruccin execute o pase todos los parmetros subsiguientes con el formato "@parameter = value". La palabra clave output La palabra clave output puede abreviarse como out , del mismo modo que execute puede acortarse como exec . Un procedimiento almacenado puede devolver varios valores; cada uno debe definirse como una variable output en el procedimiento almacenado y en las instrucciones de llamada:
exec myproc @a = @myvara out, @b = @myvarb out

Si especifica output mientras ejecuta un procedimiento y el parmetro no se define utilizando output en el procedimiento almacenado, aparecer un mensaje de error. No es un error llamar a un procedimiento que incluya especificaciones de valor de retorno sin solicitar los valores de retorno con output . Sin embargo, no se obtendrn los valores de retorno. El autor del procedimiento almacenado controla la informacin a la que pueden acceder los usuarios y stos tienen control sobre sus variables.

Reglas asociadas a procedimientos almacenados


Algunas reglas adicionales para la creacin de procedimientos almacenados son:

Las instrucciones create procedure no pueden combinarse con otras instrucciones en un solo lote. La definicin create procedure propiamente dicha puede incluir cualquier nmero y tipo de instruccin SQL, con la excepcin de use y estas instrucciones create : create view create default create rule create trigger create procedure Se pueden crear otros objetos de base de datos dentro de un procedimiento. Es posible hacer referencia a un objeto creado en el mismo procedimiento, siempre que se cree antes de hacer referencia a l. La instruccin create del objeto debe ocupar la primera posicin en el orden real de las instrucciones del procedimiento. En un procedimiento almacenado, no es posible crear un objeto, omitirlo y despus crear otro con el mismo nombre. SQL Server crea los objetos definidos en un procedimiento almacenado cuando el procedimiento se ejecuta, no cuando se compila. Si ejecuta un procedimiento que llama a otro, el procedimiento llamado puede acceder a los objetos creados por el primer procedimiento. Se puede hacer referencia a tablas temporales dentro de un procedimiento.

Si crea una tabla temporal dentro de un procedimiento, la tabla slo existe para ese procedimiento y desaparece al salir de ste. El nmero mximo de parmetros de un procedimiento almacenado es de 255. El nmero mximo de variables locales y globales de un procedimiento slo est limitado por la memoria disponible.

Calificacin de nombres dentro de procedimientos Dentro de un procedimiento almacenado, los nombres de objeto utilizados con determinados comandos deben calificarse con el nombre del propietario del objeto si otros usuarios van a hacer uso del procedimiento almacenado. Estos comandos son: alter table , create table , drop table , truncate table , create index , drop index , update statistic s , dbcc . Los nombres de objeto usados con otras instrucciones, como select o insert , dentro de un procedimiento almacenado no necesitan estar calificados porque los nombres se resuelven cuando se compila el procedimiento. Por ejemplo, el usuario "mary" , que posee la tabla marytab , debera calificar el nombre de su tabla cuando se utilice con uno de estos comandos si quiere que otros usuarios puedan ejecutar el procedimiento donde se emplea la tabla:
create procedure p1 as create index marytab_ind on mary.marytab(col1)

El motivo de esta regla es que los nombres de objeto se resuelven cuando se ejecuta el procedimiento. Si marytab no est calificada y el usuario " john" intenta ejecutar el procedimiento, SQL Server busca una tabla llamada marytab propiedad de John. El ejemplo anterior muestra el uso correcto: indica a SQL Server que busque una tabla llamada marytab propiedad de Mary.

Omisin de procedimientos almacenados


Los procedimientos se quitan con el comando drop procedure , cuya sintaxis es:
drop procedure [ owner .] procedure_name [, [ owner .] procedure_name ]...

Si un procedimiento almacenado llama a otro procedimiento almacenado que se ha omitido, SQL Server muestra un mensaje de error. Sin embargo, si se define un procedimiento con el mismo nombre para reemplazar al omitido, otros procedimientos que hagan referencia a l podrn llamarlo sin ningn problema. Es posible omitir un grupo de procedimientos, es decir, varios procedimientos con el mismo nombre pero con sufijos number diferentes, mediante una sola instruccin drop procedure . Una vez agrupados los procedimientos, los procedimientos pertenecientes al grupo no podrn omitirse de forma individual.

Cambio de nombre de los procedimientos almacenados


Se puede cambiar el nombre de un procedimiento almacenado mediante el procedimiento del sistema sp_rename , cuya sintaxis es la siguiente:
sp_rename objname , newname

Por ejemplo, para cambiar el nombre de showall a countall :


sp_rename showall, countall

Lgicamente, el nombre nuevo debe ajustarse a las reglas para identificadores. El usuario slo puede cambiar el nombre de los procedimientos almacenados que sean de su propiedad. El propietario de la base de datos puede cambiar el nombre del procedimiento almacenado de cualquier usuario. El procedimiento almacenado deber estar en la base de datos actual. Cambio de nombre de los objetos referenciados por procedimientos Es necesario omitir y volver a crear un procedimiento si se cambia el nombre de cualquiera de los objetos a los que hace referencia. Un procedimiento que hace referencia a una tabla o una vista cuyos nombres se han cambiado puede parecer que funciona de forma correcta durante un tiempo. De hecho, slo funciona hasta que SQL Server lo recompila. La recompilacin tiene lugar por muchas razones y sin notificarse al usuario. Utilice sp_depends para obtener un informe sobre los objetos a los que hace referencia un procedimiento.

Uso de procedimientos almacenados como mecanismos de seguridad


Es posible usar los procedimientos almacenados como mecanismos de seguridad a fin de controlar el acceso a la informacin de las tablas y la capacidad para efectuar modificaciones en los datos. Por ejemplo, puede denegar a otros usuarios el permiso para emplear el comando select en una tabla que es suya y crear un procedimiento almacenado que les permita visualizar slo determinadas filas o columnas. Tambin puede utilizar los procedimientos almacenados para limitar las instrucciones update , delete o insert . La persona que posee el procedimiento almacenado debe ser propietario de la tabla o vista usada en el procedimiento. Ni siquiera el administrador del sistema puede generar un procedimiento almacenado para realizar operaciones en las tablas de otro usuario si no ha recibido permiso sobre ellas. Para obtener informacin sobre cmo conceder y revocar permisos de procedimientos almacenados y otros objetos de base de datos, consulte la Gua del Usuario de las Caractersticas de Seguridad .

Procedimientos del sistema


Los procedimientos del sistema se suministran para comodidad del usuario como:

Mtodos abreviados para la recuperacin de informacin de las tablas del sistema. Mecanismos para llevar a cabo la administracin de la base de datos y otras tareas que implican la actualizacin de tablas del sistema.

La mayor parte del tiempo, las tablas del sistema slo se actualizan mediante procedimientos del sistema. Un administrador del sistema puede permitir actualizaciones directas en las tablas del sistema cambiando una variable de configuracin y emitiendo el comando reconfigure with override . Consulte la Gua de Administracin del Sistema para obtener informacin detallada. Los nombres de todos los procedimientos del sistema empiezan por "sp_". Se crean mediante el guin installmaster en la base de datos sybsystemprocs durante la instalacin de SQL Server. Los procedimientos del sistema pueden ejecutarse desde cualquier base de datos. Si ejecuta un procedimiento del sistema desde una base de datos distinta de sybsystemprocs , cualquier referencia a las tablas del sistema se correlacionan con la base de datos desde la que se ejecuta el procedimiento. Por ejemplo, si el propietario de la base de datos pubs2 ejecuta sp_adduser desde pubs2 , el usuario nuevo se aade a pubs2 .. sysusers . Cuando el parmetro de un procedimiento del sistema es un nombre de objeto y este nombre de objeto est calificado por un nombre de base de datos o de propietario, el nombre completo debe incluirse entre comillas dobles o simples. Dado que los procedimientos del sistema se encuentran en la base de datos sybsystemprocs , sus permisos tambin se definen aqu. Algunos procedimientos del sistema slo pueden ser ejecutados por los propietarios de las bases de datos. Estos procedimientos garantizan que el usuario que ejecuta el procedimiento es el propietario de la base de datos en la que se ejecutan. Otros procedimientos del sistema pueden ser ejecutados por cualquier usuario al que se ha concedido permiso execute sobre ellos, pero este permiso debe otorgarse en la base de datos sybsystemprocs . Esta situacin tiene dos consecuencias:

Un usuario puede tener permiso para ejecutar un procedimiento del sistema en todas las bases de datos o en ninguna. El propietario de una base de datos de usuario no puede controlar directamente los permisos para procedimientos del sistema dentro de su propia base de datos.

Consulte la Gua de Administracin del Sistema para obtener informacin detallada. Administracin de seguridad

Esta categora incluye procedimientos para:


Aadir, omitir e informar sobre los logins a SQL Server Aadir, omitir e informar sobre los usuarios, grupos y alias de una base de datos Cambiar contraseas y bases de datos predeterminadas Cambiar el propietario de una base de datos Aadir, omitir e informar sobre los servidores remotos que pueden acceder a este SQL Server Aadir los nombres de los usuarios de servidores remotos que pueden acceder a este SQL Server

Los procedimientos de esta categora son: sp_addlogin , sp_addalias , sp_addgroup , sp_adduser , sp_changedbowner , sp_changegroup , sp_droplogin , sp_dropalias , sp_dropgroup , sp_dropuser , sp_helpgroup , sp_helprotect , sp_helpuser , sp_password . Servidores remotos Esta categora incluye procedimientos para:

Aadir, omitir e informar sobre los servidores remotos que pueden acceder a este SQL Server Aadir los nombres de los usuarios de servidores remotos que pueden acceder a este SQL Server

Los procedimientos de esta categora son: sp_addremotelogin , sp_addserver , sp_dropremotelogin , sp_dropserver , sp_helpremotelogin , sp_helpserver , sp_remoteoption , sp_serveroption . Definicin de datos y objetos de base de datos Esta categora incluye procedimientos para:

Vincular y desvincular reglas y valores predeterminados Aadir, omitir e informar sobre claves primarias, externas y comunes Aadir, omitir e informar sobre los tipos de datos definidos por el usuario Cambiar el nombre de objetos de base de datos y tipos de datos definidos por el usuario Volver a optimizar procedimientos almacenados y disparadores Informar sobre objetos de base de datos, tipos de datos definidos por el usuario, dependencias entre objetos de base de datos, bases de datos, ndices y espacio utilizado por tablas e ndices

Los procedimientos de esta categora son: sp_bindefault , sp_bindrule , sp_unbindefault , sp_unbindrule , sp_foreignkey , sp_primarykey , sp_commonkey , sp_dropkey , sp_depends , sp_addtype , sp_droptype , sp_rename , sp_spaceused , sp_help ,

sp_helpdb , sp_helpindex , sp_helpjoins , sp_helpkey , sp_helptext , sp_indsuspect , sp_recompile . Mensajes definidos por el usuario Esta categora incluye procedimientos para:

Aadir mensajes definidos por el usuario a la tabla sysusermessages de una base de datos del usuario Omitir mensajes definidos por el usuario de sysusermessages Recuperar mensajes de sysusermessages o sysmessages de la base de datos master para su uso en instrucciones print y raiserror

Los procedimientos de esta categora son: sp_addmessage , sp_dropmessage y sp_getmessage . Administracin del sistema Esta categora incluye procedimientos para:

Aadir, omitir e informar sobre dispositivos de bases de datos y de volcado Informar sobre bloqueos, las opciones de base de datos definidas y los usuarios que estn ejecutando procesos Cambiar e informar sobre variables de configuracin Controlar de la actividad del SQL Server

Los procedimientos de esta categora son: sp_addumpdevice , sp_dropdevice , sp_helpdevice , sp_helpsort sp_logdevice , sp_dboption , sp_diskdefault , sp_configure , sp_monitor , sp_lock, sp_who . Encontrar ms informacin sobre los procedimientos del sistema que llevan a cabo estas tareas administrativas en la Gua de Administracin del Sistema . Para obtener informacin completa sobre los procedimientos del sistema, consulte el Manual de Referencia de SQL Server .

Obtencin de informacin sobre procedimientos almacenados


Varios procedimientos del sistema proporcionan informacin sobre procedimientos almacenados a partir de las tablas del sistema. sp_help Se puede obtener un informe sobre un procedimiento almacenado con el procedimiento del sistema sp_help . Por ejemplo, se puede obtener informacin sobre el procedimiento almacenado byroyalty , que forma parte de la base de datos pubs2 , de la siguiente forma:

sp_help byroyalty Name Owner ------------byroyalty dbo

type ---------------stored procedure

Created_on ------------------Feb 9 1987 3:56PM

Data_located_on_segment --------------------------Parameter_name Type Length -------------- ------ -----@percentage int 4 (return status = 0)

When_created -------------------Param_order ----------1

Se puede obtener ayuda sobre un procedimiento del sistema ejecutando sp_help al utilizar la base de datos master . sp_helptext Para mostrar el texto de la instruccin create procedure , ejecute el procedimiento del sistema sp_helptext :
sp_helptext byroyalty # Lines of Text --------------1 (1 row affected) text --------------------------------------------------create procedure byroyalty @percentage int as select au_id from titleauthor where titleauthor.royaltyper = @percentage (1 row affected, return status = 0)

Es posible ver el texto de un procedimiento del sistema ejecutando sp_helptext al utilizar la base de datos sybsystemprocs . sp_depends El procedimiento del sistema sp_depends muestra todos los procedimientos almacenados que hacen referencia al objeto especificado por el usuario, o todos los procedimientos de los que depende. Este comando muestra todos los objetos a los que hace referencia el procedimiento almacenado byroyalty creado por el usuario:
sp_depends byroyalty Cosas a las que hace referencia el objeto en la base de datos actual. object type updated selected ---------------- ----------- ---------------dbo.titleauthor user table no no

(return status = 0)

La siguiente instruccin utiliza sp_depends para mostrar todos los objetos que hacen referencia a la tabla titleauthor :
sp_depends titleauthor Cosas incluidas en la base de datos actual que hacen referencia al objeto. object -------------dbo.titleview dbo.reptq2 dbo.byroyalty type -----------------view stored procedure stored procedure

(return status = 0)

Debe omitir y volver a crear el procedimiento si el nombre de algunos de los objetos a los que hace referencia ha cambiado. Los procedimientos del sistema se explican brevemente en "Procedimientos del sistema". Para obtener informacin completa sobre los procedimientos del sistema, consulte el Manual de Referencia de SQL Server .