miércoles, 18 de enero de 2017

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
CREATE FUNCTION HumanResources.EmployeesForManager 
    (@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
CREATE FUNCTION HumanResources.EmployeeNames 
      (@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

No hay comentarios.:

Publicar un comentario