Funciones
Qué es una función escalar- La cláusula RETURNS especifica el tipo de datos
- La función se define dentro de un bloque BEGIN…END
CREATE FUNCTION Sales.SumSold(@ProductID int) RETURNS int
AS
BEGIN
DECLARE @ret int
SELECT @ret = SUM(OrderQty)
FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID
IF (@ret IS NULL)
SET @ret = 0
RETURN @ret
END
Se puede invocar en cualquier lugar donde se permita una expresión escalar del mismo tipo de datos.
SELECT ProductID, Name, Sales.SumSold(ProductID) AS SumSold
FROM Production.Product
Qué es una función con valores de tabla en línea
- RETURNS especifica la tabla como el tipo de datos
- El formato está definido por el conjunto de resultados
- El contenido de la función es una instrucción SELECT
(@ManagerId int)
RETURNS TABLE
AS
RETURN (
SELECT FirstName, LastName
FROM HumanResources.Employee Employee INNER JOIN
Person.Contact Contact ON Employee.ContactID = Contact.ContactID
WHERE ManagerID = @ManagerId )
SELECT * FROM HumanResources.EmployeesForManager(3)
-- OR
SELECT * FROM HumanResources.EmployeesForManager(6)
Qué es una función con valores de tabla de varias instrucciones
- RETURNS especifica el tipo de datos de la tabla y define la estructura
- BEGIN y END incluyen varias instrucciones
(@format nvarchar(9))
RETURNS @tbl_Employees TABLE
(EmployeeID int PRIMARY KEY, [Employee Name] nvarchar(100))
AS
BEGIN
IF (@format = 'SHORTNAME')
INSERT @tbl_Employees
SELECT EmployeeID, LastName FROM HumanResources.vEmployee
ELSE IF (@format = 'LONGNAME')
INSERT @tbl_Employees
SELECT EmployeeID, (FirstName + ' ' + LastName)
FROM HumanResources.vEmployee
RETURN
END
SELECT * FROM HumanResources.EmployeeNames('LONGNAME')
Control de errores
Los bloques TRY…CATCH proporcionan la estructura
- El bloque TRY contiene transacciones protegidas
- El bloque CATCH controla errores
CREATE PROCEDURE dbo.AddData @a int, @b int
AS
BEGIN TRY
INSERT INTO TableWithKey VALUES (@a, @b)
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() ErrorNumber,
ERROR_MESSAGE() [Message]
END CATCH