Beruflich Dokumente
Kultur Dokumente
Otras versiones Personas que lo han encontrado til: 2 de 3 - Valorar este tema 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.
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, veaEjecutar procedimientos almacenados (motor de base de datos).
puede causar conflictos en las tablas del sistema de tempdb y afectar de forma negativa al rendimiento. Se recomienda que utilice en su lugarsp_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. 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;
@LastName nvarchar(50), @FirstName nvarchar(50) AS SET NOCOUNT ON; SELECT FirstName, LastName,Department FROM HumanResources.vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName; GO
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';
El procedimiento almacenado uspGetEmployees2 se puede ejecutar en muchas combinaciones. Aqu se muestran slo algunas combinaciones: Transact-SQL EXECUTE HumanResources.uspGetEmployees2; -- Or
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 de la variable. El nombre del parmetro y de la variable no tienen por qu coincidir; sin embargo, el tipo de datos y la posicin de los parmetros deben coincidir (a menos que se 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 539.99 Mountain-500 Silver, 40 564.99 Mountain-500 Silver, 42 564.99 ... Road-750 Black, 48 539.99 Road-750 Black, 52 539.99 (14 row(s) affected) These items can be purchased for less than $700.00.
Vea tambin