Typy funkcji

SQL Server 2008obsługuje funkcje zdefiniowane przez użytkownika i wbudowany system, funkcje.

Funkcje skalarne

Zdefiniowany przez użytkownika funkcji wartość skalarna zwracają wartość danych jednego typu określonego w klauzula zwraca.Dla funkcja wartość skalarna wbudowany jest nie treści funkcja; wartość wartość skalarna jest wynikiem jednego instrukcja.Dla znajdującą funkcja wartość skalarna treści funkcja zdefiniowane w BEGIN...KONIEC blok, zawiera szereg Transact-SQL instrukcji, które zwracają pojedynczą wartość.Zwracany typ mogą być dowolnego typu danych z wyjątkiem text, ntext, image, cursor, i timestamp.

Następujące przykłady tworzy znajdującą funkcja wartość skalarna.Funkcja przyjmuje jeden wartości wejściowej ProductIDi zwraca wartość danych pojedynczy, łączną ilość produktu określonego w magazynie.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULL
    DROP FUNCTION ufnGetInventoryStock;
GO
CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
RETURNS int 
AS 
-- Returns the stock level for the product.
BEGIN
    DECLARE @ret int;
    SELECT @ret = SUM(p.Quantity) 
    FROM Production.ProductInventory p 
    WHERE p.ProductID = @ProductID 
        AND p.LocationID = '6';
     IF (@ret IS NULL) 
        SET @ret = 0;
    RETURN @ret;
END;
GO

W poniższym przykładzie użyto ufnGetInventoryStock funkcja zwracająca bieżącą ilość zapasu dla produktów, które mają ProductModelID między 75 i 80.

USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupply
FROM Production.Product
WHERE ProductModelID BETWEEN 75 and 80;
GO

Funkcje z wartościami przechowywanymi w tabelach

Zdefiniowany przez użytkownika tabela-wycenione zwrotu funkcje table typu danych.Dla wbudowanego funkcja zwracająca tabelę, nie ma żadnych treści funkcja; Tabela jest zestaw wyników single SELECT instrukcja.

Poniższy przykład tworzy wbudowanego funkcja zwracająca tabelę.Funkcja przyjmuje jeden parametr wejściowy identyfikator klienta (magazyn) i zwraca kolumny ProductID, Namei zbiorcze roku-do-data sprzedaży jako YTD Total dla każdego produktu sprzedawanego do magazynu.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
    DROP FUNCTION Sales.ufn_SalesByStore;
GO
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN 
(
    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
    FROM Production.Product AS P 
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
    JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
    WHERE C.StoreID = @storeid
    GROUP BY P.ProductID, P.Name
);
GO

W poniższym przykładzie wywołuje funkcja i określa 602 identyfikator klienta.

SELECT * FROM Sales.ufn_SalesByStore (602);

Dla zawierające funkcja zwracająca tabelę, treści funkcja zdefiniowanych w BEGIN...KONIEC blok, zawiera szereg Transact-SQL instrukcji, które budowania i wstawia wiersze do tabela, która będzie zwracana.

Poniższy przykład tworzy funkcja zwracająca tabelę.Funkcja przyjmuje jeden parametr wejściowy, EmployeeID i zwraca listę wszystkich pracowników, którzy podlegają określonego pracownika bezpośrednio lub pośrednio.Określanie 109 identyfikator pracownika następnie wywoływana jest funkcja.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL
    DROP FUNCTION dbo.ufn_FindReports;
GO
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE 
(
    EmployeeID int primary key NOT NULL,
    FirstName nvarchar(255) NOT NULL,
    LastName nvarchar(255) NOT NULL,
    JobTitle nvarchar(50) NOT NULL,
    RecursionLevel int NOT NULL
)
--Returns a result set that lists all the employees who report to the 
--specific employee directly or indirectly.*/
AS
BEGIN
WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns
    AS (
        SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get the initial list of Employees for Manager n
        FROM HumanResources.Employee e 
            INNER JOIN Person.Person p 
            ON p.BusinessEntityID = e.BusinessEntityID
        WHERE e.BusinessEntityID = @InEmpID
        UNION ALL
        SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1 -- Join recursive member to anchor
        FROM HumanResources.Employee e 
            INNER JOIN EMP_cte
            ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
            INNER JOIN Person.Person p 
            ON p.BusinessEntityID = e.BusinessEntityID
        )
-- copy the required columns to the result of the function 
   INSERT @retFindReports
   SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
   FROM EMP_cte 
   RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM dbo.ufn_FindReports(1); 

GO

Funkcje wbudowane

Funkcje wbudowane są dostarczane przez SQL Server ułatwiających wykonywanie różnych operacji.Nie można modyfikować.Można użyć funkcje wbudowane w Transact-SQL oświadczenia:

  • Dostęp do informacji z SQL Server tabele systemowe bez uzyskiwania dostępu do tabele systemowe bezpośrednio.Aby uzyskać więcej informacji, zobacz Za pomocą funkcji systemu.

  • Wykonywanie typowych zadań, takich jak Suma, GETDATE lub tożsamości.Aby uzyskać więcej informacji, zobacz Funkcje wbudowane (Transact-SQL).

Wbudowane funkcje zwracają albo wartość skalarna lub table typów danych.Na przykład błąd @@ zwraca wartość 0, jeśli ostatnio Transact-SQL instrukcja wykonana pomyślnie.Jeśli instrukcja wygenerowany błąd, @@ błąd zwraca numer błędu.I funkcja Suma (parameter) zwraca sumę wszystkich wartości dla parametru.