Tür işlev
SQL Server 2008kullanıcı tanımlı işlevler destekler ve yerleşik Sistem, işlevler.
Skalar işlevleri
Kullanıcı tanımlı skaler işlevleri DÖNDÜRÜR yan tümce tümce tümcesinde tanımlanan türden skaler veri değerini döndürür.Satır içi skaler fonksiyon için hiçbir işlev gövdesi vardır; skaler değer skaler deyim sonucudur.Çoklu deyimli bir skaler fonksiyon için işlev gövdesi içinde BEGIN tanımlanan...Son blok, bir dizi içeren Transact-SQL ifadeleri, dönüş skaler değer.Dönüş türü dışında herhangi bir veri türü olabilir text, ntext, image, cursor, ve timestamp.
Aşağıdaki örnekler, çoklu deyimli bir skaler işlev oluşturur.işlev bir girdi değeri alır bir ProductID, toplanan belirtilen ürün stok. yaratılacak bir tek veri değeri verir ve
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
Aşağıdaki örnek ufnGetInventoryStock sahip ürünler için cari stok miktarı dönmek için işlev bir ProductModelID 75 ve 80 arasında.
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupply
FROM Production.Product
WHERE ProductModelID BETWEEN 75 and 80;
GO
Tablo Değerli İşlevler
Kullanıcı tanımlı tablo değerli işlevler dönüş bir table veri türü.Satır içi tablo değerli işlev için hiçbir işlev gövdesi vardır; Tablo sonuç kümeni tek bir seçim olduğu deyim.
Aşağıdaki örnek, satır içi oluşturur tablo değerli işlev.işlev bir girdi parametresini mi, müşteri (deposu) kimliği alıp sütunları döndüren ProductID, Nameve toplu satışların yıl tarih YTD Total deposu satılan her ürün için
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
Aşağıdaki örnek işlev çağırır ve müşteri kimliği 602 belirtir.
SELECT * FROM Sales.ufn_SalesByStore (602);
Bir çoklu deyimli tablo değerli işlev için işlev gövdesi içinde BEGIN tanımlanan...Son blok, bir dizi içeren Transact-SQL oluşturmak ve döndürülecek bir tabloya satır eklemek ifadeleri.
Aşağıdaki örnek, bir tablo değerli işlev oluşturur.işlev tek bir giriş parametresi alır bir EmployeeID ve doğrudan veya dolaylı olarak belirtilen personel için rapor tüm çalışanların bir listesini döndürür.işlev, çalışan kimliği 109 belirterek çağrılır.
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
Yerleşik işlevler
Yerleşik işlevleri tarafından sağlanan SQL Server çeşitli gerçekleştirmenize yardımcı olmak içinoperasyon. Bunlar değiştirilemez.yerleşik işlevler kullanabilirsiniz Transact-SQL deyimleri için:
Erişim bilgileri SQL Server Sistem tabloları doğrudan erişim olmadan sistem tabloları.Daha fazla bilgi için bkz: Sistem işlevleri kullanma.
Toplam, getdate veya kimlik gibi ortak görevleri gerçekleştirin.Daha fazla bilgi için bkz: Yerleşik İşlevler (Transact-SQL).
Yerleşik işlevler ya da skaler dönmek veya table veri türü.Örneğin, @@ error 0 döndürür son Transact-SQL deyim başarıyla yürütüldü.Deyim bir hata oluşturursa, @@ error hata numarasını döndürür.Ve işlev sum (parameter) için parametre değerleri toplamını verir