Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
almacenados (motor de
base de datos)
SQL Server 2008 R2
Otras versiones
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.
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
AS
GO
@LastName nvarchar(50),
@FirstName nvarchar(50)
SET NOCOUNT ON;
SELECT FirstName, LastName,Department
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName = @LastName;
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%';
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)))+'.'
List Price
-----------------539.99
564.99
564.99
539.99
539.99
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
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)))+'.'
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
539.99
539.99
Especificar un valor de
parmetro
predeterminado
SQL Server 2008 R2
Otras versiones
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
AS
@second int = 2,
@third int = 3
-- Default value of 2
-- Default value of 3
50
Ejecutar procedimientos
almacenados (motor de
base de datos)
SQL Server 2008 R2
Otras versiones
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;
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.
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.