Kullanıcı tanımlı tablo değerli işlevler
O getiri kullanıcı tanımlı işlevleri bir table veri türü olabilir güçlü etmenin görünümler.Bu işlevler tablo değerli işlev olarak adlandırılır.Tablo ya da görünümü ifadeler de burada izin verilen tablo değerli kullanıcı tanımlı bir işlev kullanılabilir Transact-SQL sorgular.Görünümler için tek bir deyim sınırlı olmasına karşın, kullanıcı tanımlı işlevler görünümlerinde mümkün olandan daha güçlü mantığı sağlayan ek ifadeler içerebilir.
Tablo değerli kullanıcı tanımlı bir işlev, tek bir sonuç küme döndüren saklı yordamlar da değiştirebilirsiniz.from yan tümce tümce tümcesinde tablo kullanıcı tanımlı bir işlev tarafından döndürülen başvurulabilir bir Transact-SQL deyim, ancak sonuç kümeleri döndüren saklı yordamlar olamaz.
Tablo değerli kullanıcı tanımlı bir işlev bileşenleri
Tablo değerli kullanıcı tanımlı bir işlev içinde:
DÖNDÜRÜR yan tümce tümce tümce işlev tarafından döndürülen bir tablo için yerel bir dönüş değişken adını tanımlar.DÖNDÜRÜR yan tümce tümce tümce de tablo biçimini tanımlar.işlev içinde yerel kapsam yerel dönüş değişken adı.
The Transact-SQL statements in the function body build and insert rows into the return variable defined by the RETURNS clause.
return deyim yürütüldüğünde, değişken eklenen satır sekmeli çıkışını döndürülen işlev.return deyim bağımsız değişken olamaz.
Hayır Transact-SQL bir tablo değerli işlev ifadelerine dönebilirsiniz bir sonuç küme doğrudan için kullanıcının.işlev kullanıcıya geri dönmek tek bilgidir table dönen işlev.
Not
The text in row table option is automatically set to 256 for a table returned by a user-defined function.Bu değiştirilemez.readtext, WRITETEXT ve updatetext deyimleri okuma veya yazma herhangi bölümleri kullanılamaz text, ntext, veya image sütunları tablo.Daha fazla bilgi için bkz: Satır veri.
Örnek
Aşağıdaki örnek oluşturur dbo.ufnGetContactInformation işlev ve gösterir bileşenlerinin tablo değerli işlev.Bu işlev, yerel dönüş değişken adıdır @retContactInformation.Deyimleri işlev gövdesinde satır işlevi tarafından döndürülen tablo sonuç oluşturmak için bu değişkeni ekleyin.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'dbo.ufnGetContactInformation', N'TF') IS NOT NULL
DROP FUNCTION dbo.ufnGetContactInformation;
GO
CREATE FUNCTION dbo.ufnGetContactInformation(@ContactID int)
RETURNS @retContactInformation TABLE
(
-- Columns returned by the function
ContactID int PRIMARY KEY NOT NULL,
FirstName nvarchar(50) NULL,
LastName nvarchar(50) NULL,
JobTitle nvarchar(50) NULL,
ContactType nvarchar(50) NULL
)
AS
-- Returns the first name, last name, job title, and contact type for the specified contact.
BEGIN
DECLARE
@FirstName nvarchar(50),
@LastName nvarchar(50),
@JobTitle nvarchar(50),
@ContactType nvarchar(50);
-- Get common contact information
SELECT
@ContactID = BusinessEntityID,
@FirstName = FirstName,
@LastName = LastName
FROM Person.Person
WHERE BusinessEntityID = @ContactID;
-- Get contact job title
SELECT @JobTitle =
CASE
-- Check for employee
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'EM')
THEN (SELECT JobTitle
FROM HumanResources.Employee AS e
WHERE e.BusinessEntityID = @ContactID)
-- Check for vendor
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'VC')
THEN (SELECT ct.Name
FROM Person.ContactType AS ct
INNER JOIN Person.BusinessEntityContact AS bec
ON bec.ContactTypeID = ct.ContactTypeID
WHERE bec.PersonID = @ContactID)
-- Check for store
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'SC')
THEN (SELECT ct.Name
FROM Person.ContactType AS ct
INNER JOIN Person.BusinessEntityContact AS bec
ON bec.ContactTypeID = ct.ContactTypeID
WHERE bec.PersonID = @ContactID)
ELSE NULL
END;
-- Get contact type
SET @ContactType =
CASE
-- Check for employee
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'EM')
THEN 'Employee'
-- Check for vendor
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'VC')
THEN 'Vendor Contact'
-- Check for store
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'SC')
THEN 'Store Contact'
-- Check for individual consumer
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'IN')
THEN 'Consumer'
-- Check for general contact
WHEN EXISTS(SELECT * FROM Person.Person AS p
WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'GC')
THEN 'General Contact'
END;
-- Return the information to the caller
IF @ContactID IS NOT NULL
BEGIN
INSERT @retContactInformation
SELECT @ContactID, @FirstName, @LastName, @JobTitle, @ContactType;
END;
RETURN;
END;
GO
Aşağıdaki örnek, tablo değerli işlev kullanır dbo.ufnGetContactInformation from yan tümce tümce tümcesinde iki select deyimleri.
USE AdventureWorks2008R2;
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(1209);
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(5);
GO
Ayrıca bkz.