Sei sulla pagina 1di 16

Crear procedimientos

almacenados (motor de
base de datos)
SQL Server 2008 R2
Otras versiones

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.
Las funciones de control de errores tales como ERROR_LINE y
ERROR_PROCEDURE 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.
USE AdventureWorks2008R2;
GO
CREATE PROCEDURE dbo.sp_who
AS
SELECT FirstName, LastName FROM Person.Person;
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 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
sistemasp_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 almacenado temporal, ste ya no se puede volver a ejecutar. Slo
podrn finalizar las conexiones que hayan empezado a ejecutar el procedimiento
almacenado.
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
negativa al rendimiento. Se recomienda que utilice en su lugar sp_executesql. El procedimiento sp_executes
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.
Transact-SQL
USE AdventureWorks2008R2;
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, Department
FROM HumanResources.vEmployeeDepartmentHistory;
GO

El procedimiento almacenado uspGetEmployees se puede ejecutar de estas formas:


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

B. Utilizar un procedimiento simple con parmetros


El siguiente procedimiento almacenado slo devuelve el empleado especificado
(nombre y apellidos), su puesto y el nombre de su departamento a partir de una vista.
Este procedimiento almacenado acepta coincidencias exactas de los parmetros
pasados.
Transact-SQL
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees

AS

GO

@LastName nvarchar(50),
@FirstName nvarchar(50)
SET NOCOUNT ON;
SELECT FirstName, LastName,Department
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName = @LastName;

El procedimiento almacenado uspGetEmployees se puede ejecutar de estas formas:


Transact-SQL
EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName =
N'Pilar';
GO
-- Or
EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName =
N'Ackerman';
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetEmployees N'Ackerman', N'Pilar';

C. Utilizar un procedimiento simple con parmetros comodn


El siguiente procedimiento almacenado slo devuelve los empleados especificados
(nombre y apellidos), sus puestos y los nombres de sus departamentos a partir de una
vista. Este patrn de procedimiento almacenado coincide con los parmetros pasados
o, si stos no se proporcionan, utiliza los valores predeterminados (apellidos que
comienzan por la letra D).
Transact-SQL
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'HumanResources.uspGetEmployees2', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetEmployees2;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees2
@LastName nvarchar(50) = N'D%',
@FirstName nvarchar(50) = N'%'
AS
SET NOCOUNT ON;
SELECT FirstName, LastName, Department
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;
GO

El procedimiento almacenado uspGetEmployees2 se puede ejecutar en muchas


combinaciones. Aqu se muestran slo algunas combinaciones:
Transact-SQL

EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE

HumanResources.uspGetEmployees2;
HumanResources.uspGetEmployees2 N'Wi%';
HumanResources.uspGetEmployees2 @FirstName = N'%';
HumanResources.uspGetEmployees2 N'[CK]ars[OE]n';
HumanResources.uspGetEmployees2 N'Hesse', N'Stefen';
HumanResources.uspGetEmployees2 N'H%', N'S%';

D. Utilizar parmetros OUTPUT


El siguiente ejemplo crea el procedimiento almacenado uspGetList, que devuelve una
lista de productos con precios que no superan un importe especificado. El ejemplo
muestra la utilizacin de varias instrucciones SELECT y varios parmetros OUTPUT. Los
parmetros OUTPUT permiten a un procedimiento externo, un proceso por lotes o ms
de una instruccin Transact-SQL tener acceso a un conjunto de valores durante la
ejecucin del procedimiento.
Transact-SQL
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product varchar(40)
, @MaxPrice money
, @ComparePrice money OUTPUT
, @ListPrice money OUT
AS
SET NOCOUNT ON;
SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO

Ejecute uspGetList para obtener una lista de los productos Adventure Works (Bikes) que
cuestan menos de 700 $. Los parmetros OUTPUT @Cost y @ComparePrices se
utilizan con el lenguaje de control de flujo para devolver un mensaje en la
ventana Messages.

Nota

La variable OUTPUT debe definirse durante la creacin del procedimiento, as como durante la utilizacin d
la variable no tienen por qu coincidir; sin embargo, el tipo de datos y la posicin de los parmetros deben co
utilice @Listprice= variable).
Transact-SQL
DECLARE @ComparePrice money, @Cost money
EXECUTE Production.uspGetList '%Bikes%', 700,
@ComparePrice OUT,
@Cost OUTPUT
IF @Cost <= @ComparePrice
BEGIN
PRINT 'These products can be purchased for less than
$'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all products in this category exceed
$'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'

Este es el conjunto de resultados parciales:


Product
-------------------------------------------------Road-750 Black, 58
Mountain-500 Silver, 40
Mountain-500 Silver, 42
...
Road-750 Black, 48
Road-750 Black, 52

List Price
-----------------539.99
564.99
564.99

(14 row(s) affected)

539.99
539.99

These items can be purchased for less than $700.00.

Especificar la direccin de
un parmetro
SQL Server 2008 R2
Otras versiones

La direccin de un parmetro puede ser de entrada, que indica que un valor se pasa al
parmetro de entrada de un procedimiento almacenado, o de salida, que indica que el
procedimiento almacenado devuelve un valor al programa que lo llama mediante un
parmetro de salida. El valor predeterminado es un parmetro de entrada.
Para especificar un parmetro de salida, debe indicar la palabra clave OUTPUT en la
definicin del parmetro del procedimiento almacenado. El procedimiento almacenado
devuelve el valor actual del parmetro de salida al programa que lo llama cuando se
abandona el procedimiento almacenado. El programa que realiza la llamada tambin
debe utilizar la palabra clave OUTPUT al ejecutar el procedimiento almacenado, a fin de
guardar el valor del parmetro en una variable que se pueda utilizar en el programa
que llama. Para obtener ms informacin, vea Devolver datos mediante parmetros
OUTPUT.

Ejemplos
El siguiente ejemplo crea el procedimiento almacenado Production.usp_GetList,
que devuelve una lista de productos con precios que no superan un importe
especificado. El ejemplo muestra la utilizacin de varias instrucciones SELECT y varios
parmetros OUTPUT. Los parmetros OUTPUT permiten a un procedimiento externo, un
proceso por lotes o ms de una instruccin Transact-SQL tener acceso a un conjunto de
valores durante la ejecucin del procedimiento.
Transact-SQL
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product varchar(40)
, @MaxPrice money
, @ComparePrice money OUTPUT
, @ListPrice money OUT

AS
SET NOCOUNT ON;
SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO

Ejecute usp_GetList para conseguir una lista de productos de Adventure Works


(bicicletas) que cuesten menos de 700 $. Los parmetros
OUTPUT @cost y@compareprices se utilizan con lenguaje de control de flujo para
devolver un mensaje en la ventana Mensajes.

Nota

La variable OUTPUT debe definirse durante la creacin del procedimiento, as como durante la utilizacin d
la variable no tienen por qu coincidir. Sin embargo, el tipo de datos y la posicin de los parmetros deben co
utilice @listprice= variable).
Transact-SQL
DECLARE @ComparePrice money, @Cost money
EXECUTE Production.uspGetList '%Bikes%', 700,
@ComparePrice OUT,
@Cost OUTPUT
IF @Cost <= @ComparePrice
BEGIN
PRINT 'These products can be purchased for less than
$'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all products in this category exceed
$'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'

Este es el conjunto de resultados parciales:


Product

List Price

-------------------------------------------------Road-750 Black, 58
Mountain-500 Silver, 40
Mountain-500 Silver, 42
...
Road-750 Black, 48
Road-750 Black, 52

-----------------539.99
564.99
564.99

(14 row(s) affected)

539.99
539.99

These items can be purchased for less than $700.00.

Especificar un valor de
parmetro
predeterminado
SQL Server 2008 R2
Otras versiones

Puede crear un procedimiento almacenado con parmetros opcionales especificando


un valor predeterminado para los mismos. Al ejecutar el procedimiento almacenado, se
utilizar el valor predeterminado si no se ha especificado ningn otro.
Es necesario especificar valores predeterminados, ya que el sistema devuelve un error
si en el procedimiento almacenado no se especifica un valor predeterminado para un
parmetro y el programa que realiza la llamada no proporciona ningn otro valor al
ejecutar el procedimiento.
Si no se puede especificar ningn valor predeterminado para el parmetro, siempre se
puede especificar NULL y dejar que el procedimiento almacenado devuelva un mensaje
personalizado en caso de ejecutarse sin que el parmetro tenga un valor.

Nota

Si el valor predeterminado es una cadena de caracteres con signos de puntuacin o espacios en blanco incrus
ejemplo, 6xxx), deber estar delimitado por comillas simples y rectas.

Ejemplos
En el ejemplo siguiente se crea el procedimiento usp_GetSalesYTD con un
parmetro de entrada, @SalesPerson. NULL se asigna como valor predeterminado
para el parmetro y se utiliza en las instrucciones de control de errores para devolver
un mensaje de error personalizado en los casos en que se ejecute el procedimiento
almacenado sin que el parmetro @SalesPerson tenga un valor.

Transact-SQL
USE AdventureWorks2008R2;
GO
IF OBJECT_ID('Sales.uspGetSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.uspGetSalesYTD;
GO
CREATE PROCEDURE Sales.uspGetSalesYTD
@SalesPerson nvarchar(50) = NULL -- NULL default value
AS
SET NOCOUNT ON;
-- Validate the @SalesPerson parameter.
IF @SalesPerson IS NULL
BEGIN
PRINT 'ERROR: You must specify the last name of the sales person.'
RETURN
END
-- Get the sales for the specified sales person and
-- assign it to the output parameter.
SELECT SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID =
sp.BusinessEntityID
WHERE LastName = @SalesPerson;
RETURN
GO

En el ejemplo siguiente se ejecuta el procedimiento almacenado. La primera


instruccin ejecuta el procedimiento almacenado sin especificar ningn valor de
entrada. Esto hace que las instrucciones de control de errores del procedimiento
almacenado devuelvan el mensaje de error personalizado. La segunda instruccin
proporciona un valor de entrada y devuelve el conjunto de resultados esperado.
-- Run the stored procedure without specifying an input value.
EXEC Sales.usp_GetSalesYTD;
GO
-- Run the stored procedure with an input value.
EXEC Sales.usp_GetSalesYTD N'Blythe';
GO
En el ejemplo siguiente se muestra el procedimiento my_proc con valores
predeterminados para los tres parmetros @first, @second y @third, as como los
valores que se obtienen al ejecutar el procedimiento almacenado con otros valores de
parmetro:
Transact-SQL
IF OBJECT_ID('dbo.my_proc', 'P') IS NOT NULL
DROP PROCEDURE dbo.my_proc;
GO
CREATE PROCEDURE dbo.my_proc
@first int = NULL, -- NULL default value

AS

@second int = 2,
@third int = 3

-- Default value of 2
-- Default value of 3

SET NOCOUNT ON;


SELECT @first, @second, @third;
GO
EXECUTE dbo.my_proc; -- No parameters supplied
GO
El conjunto de resultados es el siguiente.
NULL 2 3
EXECUTE dbo.my_proc 10, 20, 30;-- All parameters supplied
GO
El conjunto de resultados es el siguiente.
10 20 30
EXECUTE dbo.my_proc @second = 500;
name
GO

-- Only second parameter supplied by

El conjunto de resultados es el siguiente.


NULL 500 3
EXECUTE dbo.my_proc 40, @third = 50 -- Only first and third parameters
-- are supplied.
El conjunto de resultados es el siguiente.
40

50

Ejecutar procedimientos
almacenados (motor de
base de datos)
SQL Server 2008 R2
Otras versiones

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 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.
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
estos mtodos en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente lo
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

SQL Server 2008 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.
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.
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.
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 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 almace
por el usuario no llegar a ejecutarse si utiliza una referencia de nombre certificado que no sea de esquema. P
procedimientos almacenados (motor de base de datos).

Especificar parmetros
Es posible proporcionar 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.
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 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.

Potrebbero piacerti anche