Ejecutar procedimientos almacenados (motor de base de datos)

Para ejecutar un procedimiento almacenado, utilice la instrucción EXECUTE de Transact-SQL. También puede ejecutar un procedimiento almacenado sin necesidad de utilizar la palabra clave EXECUTE si el procedimiento almacenado es la primera instrucción del lote.

Ejecutar procedimientos almacenados del sistema

Los procedimientos almacenados del sistema comienzan con los caracteres sp_. Se almacenan físicamente en la base de datos de recursos, pero aparecen lógicamente en el esquema sys de cada base de datos definida por el sistema y por el usuario en la instancia de 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 método recomendado para ejecutar un procedimiento almacenado del sistema.

EXEC sys.sp_who;

En los siguientes ejemplos se muestran algunos métodos para ejecutar procedimientos almacenados del sistema compatibles con versiones anteriores.

Nota

Los siguientes métodos para ejecutar procedimientos almacenados del sistema se eliminarán de las versiones futuras de SQL Server. Evite el uso de estos métodos en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente los emplean.

EXEC sp_who;
EXEC master.dbo.sp_who;
EXEC mydatabase..sp_who;
EXEC dbo.sp_who;
EXEC mydatabase.dbo.sp_who;

Intercalar bases de datos coincidentes

SQL Server 2008 usa la intercalación de base de datos de llamada al comparar los nombres de los procedimientos del sistema. Por lo tanto, en la aplicación, debe utilizar en todo momento las letras mayúsculas y minúsculas correctas de los nombres de los procedimientos del sistema. Por ejemplo, este código generará un error en el contexto de una base de datos que tenga una intercalación que distinga mayúsculas de minúsculas.

exec SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help 

Utilice las vistas de catálogo 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 físicamente en la base de datos de recursos, pero aparecen lógicamente 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 método recomendado para ejecutar un procedimiento almacenado extendido del sistema.

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 módulo, como lo es una función 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 método recomendado para ejecutar un procedimiento almacenado definido por el usuario.

USE AdventureWorks2008R2;
GO
EXEC dbo.uspGetEmployeeManagers 50;

- O bien -

EXEC AdventureWorks2008R2.dbo.uspGetEmployeeManagers 50;
GO

Si se especifica un procedimiento almacenado no calificado definido por el usuario, 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 dinámico. Si el nombre del procedimiento no calificado aparece dentro del cuerpo de otra definición de procedimiento, a continuación se busca el esquema que contiene este otro procedimiento. Para obtener más información acerca de los esquemas predeterminados, vea Separación de esquemas de usuario.

  • El esquema dbo de la base de datos actual.

Nota importanteImportante

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 más información, vea Crear procedimientos almacenados (motor de base de datos).

Especificar parámetros

Es posible proporcionar los valores de los parámetros 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 función como valor de parámetro. Las variables pueden ser definidas por el usuario o ser variables del sistema, como @@spid.

En los siguientes ejemplos se muestra cómo se pasan valores de parámetros al uspGetWhereUsedProductID del procedimiento almacenado. El procedimiento espera valores para dos parámetros de entrada: un Id. de producto y una fecha. Los ejemplos muestran cómo pasar parámetros como constantes y variables y también cómo usar una variable para pasar el valor de una función.

USE AdventureWorks2008R2;
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 parámetros en un orden distinto al orden en que están definidos en el procedimiento almacenado, debe ponerles nombre. Para obtener más información, vea Especificar un nombre de parámetro.

Para especificar que un parámetro debe devolver un valor al programa que hace la llamada, use la palabra clave OUTPUT. Para obtener más información, vea Especificar la dirección de un parámetro.

Especificar el orden de los parámetros

Si especifica los parámetros con el formato **@parámetro =**value, puede proporcionarlos en cualquier orden. También puede omitir los parámetros para los que se hayan especificado valores predeterminados. Si sólo especifica un parámetro con el formato **@parámetro =**value, deberá proporcionar todos los parámetros subsiguientes del mismo modo. Si no especifica los parámetros con el formato **@parámetro =**value, deberá especificarlos en el orden que se ha seguido en la instrucción CREATE PROCEDURE.

Cuando ejecute un procedimiento almacenado, el servidor rechazará todos los parámetros que no se incluyeron en la lista de parámetros durante la creación del procedimiento. No se aceptará ningún parámetro pasado por referencia (el nombre del parámetro se pasa explícitamente) si el nombre del parámetro no coincide.

Usar valores predeterminados en los parámetros

Aunque puede omitir los parámetros para los que se hayan especificado valores predeterminados, sólo puede truncar la lista de parámetros. Por ejemplo, si en un procedimiento almacenado hay cinco parámetros, puede omitir el cuarto y el quinto, pero no puede omitir el cuarto e incluir el quinto a menos que suministre los parámetros con el formato **@parámetro =**value.

El valor predeterminado de un parámetro, si se ha definido para el parámetro del procedimiento almacenado, se utiliza cuando:

  • No existe ningún valor especificado para el parámetro en el momento de ejecutar el procedimiento almacenado.

  • Se especifica la palabra clave DEFAULT como valor para el parámetro.