Sei sulla pagina 1di 15

Los procedimientos almacenados de Microsoft SQL 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 TransactSQL 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. n Microsoft SQL Server 2005 hay disponibles varios tipos de procedimientos almacenados. En este tema se describen de forma resumida los tipos de procedimientos almacenados y se incluyen ejemplos de cada uno de ellos. Procedimientos almacenados definidos por el usuario 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 2005 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. Por ejemplo, una aplicacin Web de comercio electrnico puede utilizar un procedimiento almacenado para devolver informacin acerca de determinados productos en funcin de los criterios de bsqueda especificados por el usuario en lnea.

CLR
Un procedimiento almacenado CLR es una referencia a un mtodo Common Language Runtime (CLR) de Microsoft .NET Framework que puede aceptar y devolver parmetros suministrados por el usuario. Se implementan como mtodos pblicos y estticos en una clase de un ensamblado de .NET Framework. Para obtener ms informacin, vea Procedimientos almacenados CLR (en ingls). Procedimientos almacenados extendidos

Importante: Esta caracterstica se quitar en una versin futura de Microsoft SQL Server. Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. En su lugar, utilice la integracin CLR. Los procedimientos almacenados extendidos le permiten crear sus propias rutinas externas en un lenguaje de programacin como pueda ser C. Los procedimientos almacenados extendidos son DLL que una instancia de Microsoft SQL Server puede cargar y ejecutar dinmicamente. Los procedimientos almacenados extendidos se ejecutan directamente en el espacio de direccin de una instancia de SQL Server y se programan con la API Procedimiento almacenado extendido de SQL Server. Nota: La integracin CLR es una alternativa ms consolidada y segura para escribir procedimientos almacenados extendidos. Procedimientos almacenados del sistema

Muchas de las actividades administrativas en SQL Server 2005 se realizan mediante un tipo especial de procedimiento conocido como procedimiento almacenado del sistema. Por ejemplo, sys.sp_changedbowner es un procedimiento almacenado del sistema. Los procedimientos almacenados del sistema se almacenan fsicamente en la base de datos Resource e incluyen el prefijo sp_. Los procedimientos almacenados del sistema aparecen de forma lgica en el esquema sys de cada base de datos definida por el usuario y el sistema. En SQL Server 2005, los permisos GRANT, DENY y REVOKE se pueden aplicar a los procedimientos almacenados del sistema. Para obtener una lista completa de los procedimientos almacenados del sistema, vea Procedimientos almacenados del sistema (Transact-SQL). SQL Server admite los procedimientos almacenados del sistema que proporcionan una interfaz desde SQL Server a los programas externos para

varias actividades de mantenimiento. Estos procedimientos almacenados extendidos utilizan el prefijo xp_. Para obtener una lista completa de los procedimientos almacenados extendidos, vea Procedimientos almacenados extendidos generales (Transact-SQL). Casi cualquier cdigo Transact-SQL que puede escribirse como un lote puede utilizarse para crear un procedimiento almacenado. Reglas para disear procedimientos almacenados 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 Microsoft SQL Server 2005, 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).

Calificar nombres dentro de procedimientos almacenados Dentro de un procedimiento almacenado, los nombres de los objetos utilizados en instrucciones (por ejemplo, SELECT o INSERT), que no se califican por esquema adoptan el valor predeterminado del esquema del procedimiento en cuestin. Si un

usuario que crea un procedimiento almacenado no califica el nombre de las tablas o las vistas a las que se hace referencia en las instrucciones SELECT, INSERT, UPDATE o DELETE dentro del mismo procedimiento, el acceso a esas tablas a travs del procedimiento se restringe, de forma predeterminada, al creador de este ltimo. Si otros usuarios van a utilizar el procedimiento almacenado, los nombres de objetos utilizados con las instrucciones de lenguaje de definicin de datos (DDL) como instrucciones CREATE, ALTER o DROP, instrucciones DBCC, instrucciones EXECUTE y SQL dinmicas, deben calificarse con el nombre del esquema de objeto. Si se especifica el nombre de esquema en estos objetos, se garantiza que el nombre indica el mismo objeto, independientemente de quin llama al procedimiento almacenado. Si no se especifica un nombre de esquema, SQL Server intenta resolver el nombre del objeto utilizando en primer lugar el esquema predeterminado del usuario que realiza la llamada o del usuario especificado en la clusula EXECUTE AS y, en segundo lugar, el esquema de dbo. Ofuscar las definiciones de procedimientos Para ofuscar el texto original de la instruccin CREATE PROCEDURE, utilice la opcin WITH ENCRYPTION. La salida de la proteccin no se puede ver directamente en ninguna de las vistas o tablas del sistema de SQL Server 2005. Los usuarios sin acceso a las tablas o vistas del sistema, o a los archivos de base de datos no pueden recuperar el texto protegido. Sin embargo, podrn tener acceso al texto los usuarios con privilegios que tengan acceso directo a los archivos de base de datos. Estos usuarios pueden aplicar ingeniera inversa a la ofuscacin para recuperar el texto original de la definicin del procedimiento almacenado. El uso de la opcin WITH ENCRYPTION impide que el procedimiento almacenado se publique como parte de la rplica de SQL Server. Opciones de la instruccin SET Database Engine (Motor de base de datos) guarda los valores de SET QUOTED_IDENTIFIER y de SET ANSI_NULLS cuando se crea o se altera un procedimiento almacenado Transact-SQL. Estos valores originales se utilizan cuando se ejecuta el procedimiento almacenado. Por tanto, cualquier valor de sesin de cliente de SET QUOTED_IDENTIFIER y SET ANSI_NULLS se omitir durante la ejecucin del procedimiento almacenado. Las instrucciones SET QUOTED_IDENTIFIER y SET ANSI_NULLS que se producen en el procedimiento almacenado no afectan a la funcionalidad del mismo. Otras opciones de SET, como SET ARITHABORT, SET ANSI_WARNINGS o SET ANSI_PADDINGS no se guardan cuando se crea o se altera un procedimiento almacenado. Si la lgica del procedimiento almacenado depende de un valor especfico, incluya una instruccin SET al inicio del procedimiento para asegurar el valor adecuado. Cuando una instruccin SET se ejecuta desde un procedimiento almacenado, el valor permanece activo slo hasta que se completa el procedimiento almacenado. A continuacin, la configuracin vuelve al valor que tena cuando se llam al procedimiento almacenado. Esto permite a los clientes individuales establecer las opciones deseadas sin afectar a la lgica del procedimiento almacenado.

Nota: No se respeta ANSI_WARNINGS al pasar parmetros de un procedimiento almacenado o de una funcin definida por el usuario o al declarar y establecer variables en una instruccin de lote. Por ejemplo, si una variable se define como char(3) y despus se establece en un valor de ms de tres caracteres, los datos se truncan hasta el tamao definido y la instruccin INSERT o UPDATE se ejecuta correctamente.

Puede crear procedimientos almacenados mediante la instruccin CREATE PROCEDURE de Transact-SQL. Antes de crearlos, tenga en cuenta lo siguiente:

Las instrucciones CREATE PROCEDURE no se pueden combinar con otras instrucciones SQL en el mismo lote. Para crear procedimientos, debe disponer del permiso CREATE PROCEDURE en la base de datos y del permiso ALTER en el esquema donde se crea el procedimiento. En procedimientos almacenados CLR, debe ser propietario del ensamblado al que se hace referencia en <method_specifier> o disponer del permiso REFERENCES en dicho ensamblado. Los procedimientos almacenados son objetos de mbito de esquema y sus nombres deben ajustarse a las reglas para los identificadores. Slo puede crear un procedimiento almacenado en la base de datos actual.

Cuando cree un procedimiento almacenado, deber especificar lo siguiente:


Todos los parmetros de entrada y de salida del lote o del procedimiento que realiza la llamada. Las instrucciones de programacin que realicen operaciones en la base de datos, incluidas las llamadas a otros procedimientos. El valor de estado devuelto al lote o al procedimiento que realiza la llamada, a fin de indicar que la operacin se ha realizado correctamente o que se ha producido un error (y el motivo del mismo). Las instrucciones de control de errores necesarias para detectar y administrar posibles errores. Microsoft SQL Server 2005 presenta nuevas funciones de control de errores como ERROR_LINE y ERROR_PROCEDURE que se pueden especificar en el procedimiento almacenado. Para obtener ms informacin, vea Usar TRY...CATCH en Transact-SQL.

Asignar nombre a los procedimientos almacenados Se recomienda que no cree procedimientos almacenados con el prefijo sp_. SQL Server utiliza el prefijo sp_ para indicar procedimientos almacenados del sistema. El nombre que elija puede entrar en conflicto con algn procedimiento futuro del sistema. Si la aplicacin utiliza referencias de nombre completo que no son de esquema y el nombre de su procedimiento entra en conflicto con un procedimiento del sistema, la aplicacin generar un error ya que el nombre se enlaza con el procedimiento del sistema, no con el suyo.

Un procedimiento almacenado definido por el usuario, con el mismo nombre que un procedimiento almacenado del sistema y que no est calificado o se encuentre en el esquema dbo no se ejecutar nunca; siempre se ejecutar el procedimiento almacenado del sistema. En el ejemplo siguiente se muestra este comportamiento. Copiar
USE AdventureWorks; GO CREATE PROCEDURE dbo.sp_who AS SELECT FirstName, LastName FROM Person.Contact; GO EXEC sp_who; EXEC dbo.sp_who; GO DROP PROCEDURE dbo.sp_who; GO

Si se utiliza un calificador de esquema explcito tambin se consigue una ligera mejora del rendimiento. La resolucin de nombres es un poco ms rpida si Database Engine (Motor de base de datos) no tiene que buscar en varios esquemas para encontrar el procedimiento. Para obtener ms informacin, vea Ejecutar procedimientos almacenados (motor de base de datos). Procedimientos almacenados temporales De forma similar a las tablas temporales, los procedimientos almacenados temporales (tanto privados como globales) se pueden crear agregando los prefijos # y ## delante del nombre del procedimiento. # denota un procedimiento almacenado temporal local; ## denota un procedimiento almacenado temporal global. Estos procedimientos dejan de existir cuando se cierra SQL Server. Los procedimientos almacenados temporales son tiles para conectarse a versiones anteriores de SQL Server que no permiten volver a utilizar los planes de ejecucin para instrucciones o lotes de Transact-SQL. Las aplicaciones que se conecten a SQL Server 2000 y versiones posteriores deben utilizar el procedimiento almacenado del sistema sp_executesql, en vez de procedimientos almacenados temporales. Slo puede ejecutar un procedimiento temporal local la conexin que lo cre; el procedimiento se elimina automticamente cuando se cierra la conexin. Cualquier conexin puede ejecutar un procedimiento almacenado temporal global. ste existe hasta que se cierra la conexin que el usuario utiliz para crearlo, y hasta que se completan todas las versiones del procedimiento que se estuvieran ejecutando mediante otras conexiones. Una vez cerrada la conexin que se utiliz para crear el procedimiento, ste ya no se puede volver a ejecutar. Slo podrn finalizar las conexiones que hayan empezado a ejecutar el procedimiento. Si se crea directamente en la base de datos tempdb un procedimiento almacenado sin el prefijo # o ##, el procedimiento en cuestin se eliminar automticamente cuando se cierre SQL Server, ya que tempdb se vuelve a crear cada vez que se inicia SQL Server. Los procedimientos creados directamente en tempdb existen incluso despus de haber finalizado la conexin en que se crearon.

Nota: Utilizar excesivamente los procedimientos almacenados temporales puede causar conflictos en las tablas del sistema de tempdb y afectar de forma negativa al rendimiento. Se recomienda que utilice en su lugar sp_executesql. El procedimiento sp_executesql no almacena datos en las tablas del sistema y, por tanto, evita el problema. Los procedimientos almacenados CLR no se pueden crear como procedimientos almacenados temporales. Ejemplos

A. Utilizar un procedimiento sencillo con una instruccin SELECT compleja


El siguiente procedimiento almacenado devuelve todos los empleados (nombre y apellidos), sus puestos y los nombres de sus departamentos a partir de una vista. Este procedimiento almacenado no utiliza ningn parmetro. Copiar
USE AdventureWorks; GO IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetAllEmployees; GO CREATE PROCEDURE HumanResources.uspGetAllEmployees AS SET NOCOUNT ON; SELECT LastName, FirstName, JobTitle, Department FROM HumanResources.vEmployeeDepartment; GO

El procedimiento almacenado uspGetEmployees se puede ejecutar de estas formas: Copiar


EXECUTE HumanResources.uspGetAllEmployees; GO -- Or EXEC HumanResources.uspGetAllEmployees; GO -- Or, if this procedure is the first statement within a batch: HumanResources.uspGetAllEmployees;

En este tema se describe cmo crear un procedimiento almacenado de Transact-SQL mediante el Explorador de objetos de SQL Server Management Studio y se ofrece un ejemplo en el que se crea un procedimiento almacenado simple en la base de datos AdventureWorks. Para crear un procedimiento almacenado

1. En el Explorador de objetos, conctese a una instancia de SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) y expndala. 2. Expanda Bases de datos, la base de datos a la que pertenece el procedimiento almacenado y, por ltimo, Programacin. 3. Haga clic con el botn secundario en Procedimientos almacenados y, a continuacin, haga clic en Nuevo procedimiento almacenado. 4. En el men Consulta, haga clic en Especificar valores para parmetros de plantilla. 5. En el cuadro de dilogo Especificar valores para parmetros de plantilla, la columna Valor contiene valores recomendados para los parmetros. Acepte los valores o reemplcelos con nuevos valores y, a continuacin, haga clic en Aceptar. 6. En el editor de consultas, reemplace la instruccin SELECT por las instrucciones para el procedimiento. 7. Para probar la sintaxis, en el men Consulta, haga clic en Analizar. 8. Para crear el procedimiento almacenado, en el men Consulta, haga clic en Ejecutar. 9. Para guardar la secuencia de comandos, en el men Archivo, haga clic en Guardar. Acepte el nombre de archivo o reemplcelo por un nombre nuevo y, a continuacin, haga clic en Guardar. Nota de seguridad: Valide toda entrada de usuario. No concatene ninguna entrada de usuario antes de que se valide. No ejecute nunca un comando creado a partir de una entrada de usuario no validada. Para obtener ms informacin, vea Inyeccin de cdigo SQL. Para crear un ejemplo de procedimiento almacenado 1. En el Explorador de objetos, conctese a una instancia de SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) y expndala. 2. Expanda Bases de datos, la base de datos AdventureWorks y, por ltimo, Programacin. 3. Haga clic con el botn secundario en Procedimientos almacenados y, a continuacin, haga clic en Nuevo procedimiento almacenado. 4. En el men Consulta, haga clic en Especificar valores para parmetros de plantilla. 5. En el cuadro de dilogo Especificar valores para parmetros de plantilla, especifique los siguientes valores para los parmetros mostrados. Parmetro Valor Author Su nombre. Create Date La fecha de hoy. Description Devuelve datos de empleado. Procedure_name HumanResources.uspGetEmployees @Param1 @LastName @Datatype_For_Param1 nvarchar(50) Default_Value_For_Param1 NULL @Param2 @FirstName @Datatype_For_Param2 nvarchar(50) Default_Value_For_Param2 NULL 6. Haga clic en Aceptar.

7. En el editor de consultas, reemplace la instruccin SELECT por la siguiente instruccin: Copiar


SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName = @FirstName AND LastName = @LastName;

8. Para probar la sintaxis, en el men Consulta, haga clic en Analizar. Si se

devuelve un mensaje de error, compare las instrucciones con la informacin anterior y corrija lo que sea necesario. 9. Para crear el procedimiento almacenado, en el men Consulta, haga clic en Ejecutar. 10. Para guardar la secuencia de comandos, en el men Archivo, haga clic en Guardar. Especifique un nuevo nombre de archivo y haga clic en Guardar. 11. Para ejecutar el procedimiento almacenado, en la barra de herramientas, haga clic en Nueva consulta. 12. En la ventana de consultas, especifique las siguientes instrucciones: Copiar
USE AdventureWorks; GO EXECUTE HumanResources.uspGetEmployees @FirstName = N'Diane', @LastName = N'Margheim'; GO

13. En el men Consulta, haga clic en Ejecutar.

En este tema se describe cmo modificar un procedimiento almacenado de TransactSQL mediante el Explorador de objetos en SQL Server Management Studio. Cuando cambie las instrucciones o los parmetros de un procedimiento almacenado mediante este mtodo, los permisos definidos para el procedimiento almacenado se conservan y los procedimientos almacenados o desencadenadores dependientes no se ven afectados. Importante: El hecho de cambiar el nombre o la definicin de un procedimiento almacenado puede provocar errores en los objetos dependientes si no se actualizan con arreglo a los cambios realizados en el procedimiento almacenado. Para obtener ms informacin, vea Cmo ver las dependencias de un procedimiento almacenado (SQL Server Management Studio). Para modificar un procedimiento almacenado 1. En el Explorador de objetos, conctese a una instancia de SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) y expndala. 2. Expanda Bases de datos, a continuacin, la base de datos a la que pertenece el procedimiento almacenado y, por ltimo, Programacin. 3. Expanda Procedimientos almacenados, haga clic con el botn secundario en el procedimiento que desea modificar y, a continuacin, haga clic en Diseo. 4. Modifique el texto del procedimiento almacenado.

5. Para probar la sintaxis, en el men Consulta, haga clic en Analizar. 6. Para modificar el procedimiento almacenado, en el men Consulta, haga clic en

Ejecutar.
7. Para guardar la secuencia de comandos, en el men Archivo, haga clic en

Guardar. Acepte el nombre de archivo o sustityalo por uno nuevo y,a continuacin, haga clic en Guardar. Nota de seguridad: Valide toda entrada de usuario. No concatene ninguna entrada de usuario antes de validarla. No ejecute nunca un comando creado a partir de una entrada de usuario no validada. Para obtener ms informacin, vea Inyeccin de cdigo SQL. En este tema se describe cmo eliminar un procedimiento almacenado mediante el Explorador de objetos en SQL Server Management Studio. Importante: Eliminar un procedimiento almacenado puede hacer que los objetos y secuencias de comandos dependientes produzcan un error cuando los objetos y secuencias de comandos no se han actualizado para reflejar los cambios realizados en el procedimiento almacenado. Para obtener ms informacin, vea Cmo ver las dependencias de un procedimiento almacenado (SQL Server Management Studio). Para eliminar un procedimiento almacenado 1. En el Explorador de objetos, conctese a una instancia de SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) y expndala. 2. Expanda Bases de datos, a continuacin, la base de datos a la que pertenece el procedimiento almacenado y, por ltimo, Programacin. 3. Expanda Procedimientos almacenados, haga clic con el botn secundario en el procedimiento que desee eliminar y, a continuacin, haga clic en Eliminar. 4. Para ver los objetos que dependen del procedimiento almacenado, haga clic en Mostrar dependencias. 5. Confirme que haya seleccionado el procedimiento almacenado correcto y haga clic en Aceptar. 6. Quite el nombre del procedimiento almacenado de los objetos y secuencias de comandos dependientes. En este tema se describe cmo ver las dependencias de un procedimiento almacenado mediante el Explorador de objetos en SQL Server Management Studio. Antes de modificar, cambiar el nombre o eliminar un procedimiento almacenado, es importante conocer qu objetos dependen de l. Por ejemplo, el hecho de cambiar el nombre o la definicin de un procedimiento almacenado puede provocar errores en los objetos dependientes si no se actualizan con arreglo a los cambios realizados en el procedimiento almacenado. Para ver las dependencias de un procedimiento almacenado 1. En el Explorador de objetos, conctese a una instancia de SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) y expndala.

2. Expanda Bases de datos, luego la base de datos a la que pertenece el 3.

4. 5.
6.

procedimiento almacenado y, por ltimo, Programacin. Expanda Procedimientos almacenados, haga clic con el botn secundario en el procedimiento y, a continuacin, haga clic en Ver dependencias. Examine la lista de objetos que dependen del procedimiento almacenado. Examine la lista de objetos de los cuales depende el procedimiento almacenado. Haga clic en Aceptar.

En este tema se describe cmo conceder permisos en un procedimiento almacenado mediante el Explorador de objetos en SQL Server Management Studio. Puede conceder permisos a un usuario existente, una funcin de base de datos o una funcin de aplicacin en la base de datos. Procedimientos Para conceder permisos en un procedimiento almacenado 1. En el Explorador de objetos, conctese a una instancia de SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) y expndala. 2. Expanda Bases de datos, a continuacin, la base de datos a la que pertenece el procedimiento almacenado y, por ltimo, Programacin. 3. Expanda Procedimientos almacenados, haga clic con el botn secundario en el procedimiento sobre el que desea conceder permisos y, a continuacin, haga clic en Propiedades. 4. En Propiedades del procedimiento almacenado, seleccione la pgina Permisos. 5. Para conceder permisos a un usuario, una funcin de base de datos o una funcin de aplicacin, haga clic en Agregar. 6. En Seleccionar usuarios o funciones, haga clic en Tipos de objeto para agregar o borrar los usuarios y las funciones que desee. 7. En la cuadrcula Permisos explcitos, seleccione los permisos que desea conceder a la funcin o usuario especificados. Para obtener una descripcin de los permisos, vea Permisos. Al seleccionar Conceder, se indica que se conceder el permiso especificado al receptor. Al seleccionar WITH GRANT, se indica que el receptor tambin podr conceder el permiso especificado a otras entidades de seguridad. Nota: No se puede usar SQL Server Management Studio para conceder permisos sobre procedimientos almacenados del sistema o funciones del sistema. En su lugar, use GRANT (permisos de objeto de Transact-SQL). Para ejecutar un procedimiento almacenado, utilice la instruccin EXECUTE de Transact-SQL. Tambin puede ejecutar un procedimiento almacenado sin necesidad de utilizar la palabra clave EXECUTE si el procedimiento almacenado es la primera instruccin del lote. Ejecutar procedimientos almacenados del sistema

Los procedimientos almacenados del sistema comienzan con los caracteres sp_. Se almacenan fsicamente en la base de datos de recursos, pero aparecen lgicamente en el esquema sys de cada base de datos definida por el sistema y por el usuario en la instancia de Microsoft SQL Server. Los procedimientos almacenados del sistema se pueden ejecutar desde cualquier base de datos aunque el nombre del procedimiento almacenado no sea completo. Un nombre completo que no sea de esquema puede ser un nombre de una parte como sp_someproc o un nombre de tres partes como somedb..sp_someproc cuya segunda parte, es decir, el nombre del esquema, no est especificada. Se recomienda que certifique como de esquema todos los nombres de procedimientos almacenados del sistema con el nombre de esquema sys a fin de evitar conflictos de nombre. En el siguiente ejemplo se muestra el mtodo recomendado para ejecutar un procedimiento almacenado del sistema. Copiar
EXEC sys.sp_who;

En los siguientes ejemplos se muestran algunos mtodos para ejecutar procedimientos almacenados del sistema compatibles con versiones anteriores. Nota: Los siguientes mtodos para ejecutar procedimientos almacenados del sistema se eliminarn de las versiones futuras de SQL Server. Evite el uso de estos mtodos en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente los emplean. Copiar
EXEC EXEC EXEC EXEC EXEC sp_who; master.dbo.sp_who; mydatabase..sp_who; dbo.sp_who; mydatabase.dbo.sp_who;

Intercalar bases de datos coincidentes


Microsoft SQL Server 2005 usa la intercalacin de base de datos de llamada al comparar los nombres de los procedimientos del sistema. Por lo tanto, en la aplicacin, debe utilizar en todo momento las letras maysculas y minsculas correctas de los nombres de los procedimientos del sistema. Por ejemplo, este cdigo generar un error en el contexto de una base de datos que tenga una intercalacin que distinga maysculas de minsculas. Copiar
exec SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help

Utilice las vistas de catlogo sys.system_objects y sys.system_parameters para mostrar los nombres exactos de los procedimientos almacenados del sistema. Ejecutar procedimientos almacenados extendidos del sistema

Los procedimientos almacenados extendidos del sistema comienzan con los caracteres xp_. Se almacenan fsicamente en la base de datos de recursos, pero aparecen lgicamente en el esquema sys de cada base de datos definida por el sistema y por el usuario en la instancia de SQL Server. En el siguiente ejemplo se muestra el mtodo recomendado para ejecutar un procedimiento almacenado extendido del sistema. Copiar
EXEC sys.xp_subdirs 'c:\';

Ejecutar procedimientos almacenados definidos por el usuario Al ejecutar un procedimiento almacenado definido por el usuario (ya sea en un lote o dentro de un mdulo, como lo es una funcin o un procedimiento almacenado definido por el usuario), se recomienda certificar el nombre de este procedimiento por lo menos con el nombre del esquema. En el siguiente ejemplo se muestra el mtodo recomendado para ejecutar un procedimiento almacenado definido por el usuario. Copiar
USE AdventureWorks; GO EXEC dbo.uspGetEmployeeManagers 50;

- O bien Copiar
EXEC AdventureWorks.dbo.uspGetEmployeeManagers 50; GO

Si se especifica un procedimiento almacenado no calificado definido por el usuario, Database Engine (Motor de base de datos) busca el procedimiento siguiendo este orden:

El esquema sys de la base de datos actual. El esquema predeterminado del autor de la llamada se ejecuta en un lote o en SQL dinmico. Si el nombre del procedimiento no calificado aparece dentro del cuerpo de otra definicin de procedimiento, a continuacin se busca el esquema que contiene este otro procedimiento. Para obtener ms informacin acerca de los esquemas predeterminados, vea Separacin de esquemas de usuario. El esquema dbo de la base de datos actual.

Importante: Si un procedimiento almacenado creado por un usuario tiene el mismo nombre que un procedimiento almacenado del sistema, el procedimiento creado por el usuario no llegar a ejecutarse si utiliza una referencia de nombre certificado que no sea de esquema. Para obtener ms informacin, vea Crear procedimientos almacenados (motor de base de datos). Especificar parmetros Es posible suministrar los valores de los parmetros si se escribe un procedimiento almacenado que los acepte.

El valor suministrado debe ser una constante o una variable; no puede especificar un nombre de funcin como valor de parmetro. Las variables pueden ser definidas por el usuario o ser variables del sistema, como @@spid. En los siguientes ejemplos se muestra cmo se pasan valores de parmetros al uspGetWhereUsedProductID del procedimiento almacenado. El procedimiento espera valores para dos parmetros de entrada: un Id. de producto y una fecha. Los ejemplos muestran cmo pasar parmetros como constantes y variables y tambin cmo usar una variable para pasar el valor de una funcin. Copiar
USE AdventureWorks; GO -- Passing values as constants. EXEC dbo.uspGetWhereUsedProductID 819, '20050225'; GO -- Passing values as variables. DECLARE @ProductID int, @CheckDate datetime; SET @ProductID = 819; SET @CheckDate = '20050225'; EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate; GO -- Try to use a function as a parameter value. -- This produces an error message. EXEC dbo.uspGetWhereUsedProductID 819, GETDATE(); GO -- Passing the function value as a variable. DECLARE @CheckDate datetime; SET @CheckDate = GETDATE(); EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate; GO

Si desea especificar los parmetros en un orden distinto al orden en que estn definidos en el procedimiento almacenado, debe ponerles nombre. Para obtener ms informacin, vea Especificar un nombre de parmetro. Para especificar que un parmetro debe devolver un valor al programa que hace la llamada, use la palabra clave OUTPUT. Para obtener ms informacin, vea Especificar la direccin de un parmetro.

Especificar el orden de los parmetros


Si especifica los parmetros con el formato @parmetro =value, puede proporcionarlos en cualquier orden. Tambin puede omitir los parmetros para los que se hayan especificado valores predeterminados. Si slo especifica un parmetro con el formato @parmetro =value, deber proporcionar todos los parmetros subsiguientes del mismo modo. Si no especifica los parmetros con el formato @parmetro =value, deber especificarlos en el orden que se ha seguido en la instruccin CREATE PROCEDURE. Cuando ejecute un procedimiento almacenado, el servidor rechazar todos los parmetros que no se incluyeron en la lista de parmetros durante la creacin del procedimiento. No se aceptar ningn parmetro pasado por referencia (el nombre del parmetro se pasa explcitamente) si el nombre del parmetro no coincide.

Usar valores predeterminados en los parmetros


Aunque puede omitir los parmetros para los que se hayan especificado valores predeterminados, slo puede truncar la lista de parmetros. Por ejemplo, si en un procedimiento almacenado hay cinco parmetros, puede omitir el cuarto y el quinto, pero no puede omitir el cuarto e incluir el quinto a menos que suministre los parmetros con el formato @parmetro =value. El valor predeterminado de un parmetro, si se ha definido para el parmetro del procedimiento almacenado, se utiliza cuando:

No existe ningn valor especificado para el parmetro en el momento de ejecutar el procedimiento almacenado. Se especifica la palabra clave DEFAULT como valor para el parmetro.