Aracılığıyla paylaş


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:

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

Ayrıca bkz.

Diğer Kaynaklar