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.