ContactType nvarchar(50) NULL
) AS BEGIN DECLARE @FirstName nvarchar(50), @LastName nvarchar(50), @JobTitle nvarchar(50), @ContactType nvarchar(50); -- Присвоение общей информации SELECT @ContactID = ContactID, @FirstName = FirstName, @LastName = LastName FROM Person.Contact WHERE ContactID = @ContactID; SELECT @JobTitle = CASE -- Проверка служащих WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e WHERE e.ContactID = @ContactID) THEN (SELECT Title FROM HumanResources.Employee WHERE ContactID = @ContactID) -- Проверить продавцов WHEN EXISTS(SELECT * FROM Purchasing.VendorContact AS vc INNER JOIN Person.ContactType AS ct ON vc.ContactTypeID = ct.ContactTypeID WHERE vc.ContactID = @ContactID) THEN (SELECT ct.Name FROM Purchasing.VendorContact AS vc INNER JOIN Person.ContactType AS ct ON vc.ContactTypeID = ct.ContactTypeID WHERE vc.ContactID = @ContactID) -- Проверить магазины WHEN EXISTS(SELECT * FROM Sales.StoreContact AS sc INNER JOIN Person.ContactType AS ct ON sc.ContactTypeID = ct.ContactTypeID WHERE sc.ContactID = @ContactID) THEN (SELECT ct.Name FROM Sales.StoreContact AS sc INNER JOIN Person.ContactType AS ct ON sc.ContactTypeID = ct.ContactTypeID WHERE ContactID = @ContactID) ELSE NULL END; SET @ContactType = CASE -- Проверить служащих WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e WHERE e.ContactID = @ContactID) THEN 'Employee' -- Проверить продавцов WHEN EXISTS(SELECT * FROM Purchasing.VendorContact AS vc INNER JOIN Person.ContactType AS ct ON vc.ContactTypeID = ct.ContactTypeID WHERE vc.ContactID = @ContactID) THEN 'Vendor Contact' -- Проверить магазины WHEN EXISTS(SELECT * FROM Sales.StoreContact AS sc INNER JOIN Person.ContactType AS ct ON sc.ContactTypeID = ct.ContactTypeID WHERE sc.ContactID = @ContactID) THEN 'Store Contact' -- Проверить покупателей WHEN EXISTS(SELECT * FROM Sales.Individual AS i WHERE i.ContactID = @ContactID) THEN 'Consumer' END; -- формирование вызываемой информации IF @ContactID IS NOT NULL BEGIN INSERT INTO @retContactInformation SELECT @ContactID, @FirstName, @LastName, @JobTitle, @ContactType; END; RETURN; END; GO Обращение к функции: USE AdventureWorks; GO SELECT ContactID, FirstName, LastName, JobTitle, ContactType FROM dbo.ufnGetContactInformation (2200);
Результат:
Пользовательские функции, возвращающие тип данных table, могут быть полноценной альтернативой представлениям. Ссылка на эти функции происходит как на возвращающие табличное значение функции. Возвращающая табличное значение пользовательская функция может быть использована там, где в запросах Transact-SQL разрешены табличные выражения или выражения представлений. В то время как представления ограничены одной инструкцией SELECT, пользовательские функции могут содержать дополнительные инструкции, обеспечивающие более эффективную логику, чем та, которая возможна в представлениях.
Возвращающая табличное значение пользовательская функция также может заменять хранимые процедуры, возвращающие один результирующий набор. На таблицу, возвращаемую пользовательской функцией, можно ссылаться в предложении FROM инструкции Transact-SQL, в котором нельзя ссылаться на хранимые процедуры, возвращающие результирующие наборы.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|