Inline table-valued functions
Download
Report
Transcript Inline table-valued functions
Module 9:
Implementing Functions
Overview
Creating and Using Functions
Working with Functions
Controlling Execution Context
Lesson 1: Creating and Using Functions
Types of Functions
What Is a Scalar Function?
What Is an Inline Table-Valued Function?
What Is a Multi-Statement Table-Valued Function?
Practice: Creating Functions
Types of Functions
Scalar functions
Similar to built-in functions
Return a single value
Inline table-valued functions
Similar to views with parameters
Return a table as the result of single SELECT statement
Multi-statement table-valued functions
Similar to stored procedures
Return a new table as the result of INSERT statements
What Is a Scalar Function?
RETURNS clause specifies data type
Function is defined within a BEGIN…END block
CREATE FUNCTION Sales.SumSold(@ProductID int) RETURNS int
AS
BEGIN
DECLARE @ret int
SELECT @ret = SUM(OrderQty)
FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID
IF (@ret IS NULL)
SET @ret = 0
RETURN @ret
END
Can be invoked anywhere a scalar expression of the same
data type is allowed
SELECT ProductID, Name, Sales.SumSold(ProductID) AS SumSold
FROM
Production.Product
What Is an Inline Table-Valued Function?
RETURNS specifies table as data type
Format is defined by result set
Content of function is a SELECT statement
CREATE FUNCTION HumanResources.EmployeesForManager
(@ManagerId int)
RETURNS TABLE
AS
RETURN (
SELECT
FirstName, LastName
FROM
HumanResources.Employee Employee INNER JOIN
Person.Contact Contact
ON Employee.ContactID = Contact.ContactID
WHERE
ManagerID = @ManagerId )
SELECT * FROM HumanResources.EmployeesForManager(3)
-- OR
SELECT * FROM HumanResources.EmployeesForManager(6)
What Is a Multi-Statement Table-Valued Function?
RETURNS specifies table data type and defines structure
BEGIN and END enclose multiple statements
CREATE FUNCTION HumanResources.EmployeeNames
(@format nvarchar(9))
RETURNS @tbl_Employees TABLE
(EmployeeID int PRIMARY KEY, [Employee Name] nvarchar(100))
AS
BEGIN
IF (@format = 'SHORTNAME')
INSERT @tbl_Employees
SELECT EmployeeID, LastName FROM HumanResources.vEmployee
ELSE IF (@format = 'LONGNAME')
INSERT @tbl_Employees
SELECT EmployeeID, (FirstName + ' ' + LastName)
FROM
HumanResources.vEmployee
RETURN
END
SELECT * FROM HumanResources.EmployeeNames('LONGNAME')
Practice: Creating Functions
In this practice, you will:
Create a scalar function
Create an inline table-valued function
Create a multi-statement
table-valued function
Drop user-defined functions
Lesson 2: Working with Functions
Guidelines for Creating Functions
Rewriting Stored Procedures as Functions
Deterministic and Nondeterministic Functions
Deterministic and Nondeterministic Functions
Deterministic functions
Always returns the same value for the same set of
input values and database state
Results can be indexed
Aggregate and string built-in functions
Nondeterministic functions
May return different results for the same set of input
values and database state
Results cannot be indexed
Configuration, cursor, metadata, security, system
statistics built-in functions
Guidelines for Creating Functions
Determine function type
Create one function for one task
Create, test, and troubleshoot
Qualify object names inside function
Consider ability of SQL Server 2005 to index function
results
Rewriting Stored Procedures as Functions
Converting stored procedures to functions
For single resultset use a table-valued function
For single scalar value use a scalar function
Table-valued functions
Single SELECT statement with parameters
No update operations
No need for dynamic EXECUTE statements
Build intermediate results in to a temporary table
Lesson 3: Controlling Execution Context
What Is Execution Context?
The EXECUTE AS Clause
Options for Extending Impersonation Context
Demonstration: Controlling Execution Context
What Is Execution Context?
Ted
(No permissions)
Pat
(SELECT permission)
Sales.Order
(Owner: John)
GetOrders
Ted
(EXECUTE permission)
CREATE FUNCTION
AS
WITH
EXECUTE AS
RETURN ( SELECT
AS
RETURN ( SELECT
Function
(Owner: Pat)
Pat
GetOrders RETURNS TABLE
'Pat'
* FROM Sales.Order )
* FROM Sales.Order )
The EXECUTE AS Clause
EXECUTE AS options
The caller of the module
The person creating or altering the module
The owner of the module
A specified user
CREATE FUNCTION GetOrders RETURNS TABLE
SELF
WITH EXECUTE AS CALLER
OWNER
'Pat'
{
CALLER | SELF | OWNER | user_name }
AS
RETURN ( SELECT * FROM Sales.Order )
Options for Extending Impersonation Context
EXECUTE AS is restricted to current database by default
Establish a trust relationship to extend impersonation to
other databases
SET TRUSTWORTHY ON
GRANT AUTHENTICATE …
Mapped dbo
dbo
Signed Code Module
Certificate User
Demonstration: Controlling Execution Context
In this demonstration, you will see how to
use execution context within a stored
procedure
Lab: Implementing Functions
Exercise 1: Creating Functions
Exercise 2: Controlling Execution Context