0% found this document useful (0 votes)
41 views

User-Defined Functions: Database Programming

Here are the solutions to the exercises: 1. Inline table valued function to return employees in a department: CREATE FUNCTION GetEmployeesByDeptId(@deptId int) RETURNS TABLE AS RETURN SELECT e.FirstName, e.LastName FROM Employee e JOIN Department d ON e.DeptId = d.Id WHERE d.Id = @deptId 2. Scalar UDF to convert letter grade to numeric: CREATE FUNCTION GradeToNumeric(@grade char(1)) RETURNS int AS BEGIN DECLARE @numberGrade int IF @grade = 'A' SET @numberGrade = 4 ELSE IF

Uploaded by

Abrham
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
41 views

User-Defined Functions: Database Programming

Here are the solutions to the exercises: 1. Inline table valued function to return employees in a department: CREATE FUNCTION GetEmployeesByDeptId(@deptId int) RETURNS TABLE AS RETURN SELECT e.FirstName, e.LastName FROM Employee e JOIN Department d ON e.DeptId = d.Id WHERE d.Id = @deptId 2. Scalar UDF to convert letter grade to numeric: CREATE FUNCTION GradeToNumeric(@grade char(1)) RETURNS int AS BEGIN DECLARE @numberGrade int IF @grade = 'A' SET @numberGrade = 4 ELSE IF

Uploaded by

Abrham
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 24

User-Defined

Functions

Database Programming
User-Define Functions
 A user-defined function is a collection of T-SQL
statements
 accepts parameters
 performs an action and
 returns a result
 Cannot be used to perform actions that produce a side
effect such as modifying a table
 Can be invoked from a query - like system functions
 SELECT dbo.functionName (paramList)
 ALTER FUNCTION is used to modify the function and
DROP FUNCTION to delete it

2
User-Define Functions (cont.)
 User-Defined functions are used to create a reusable
routine:
 In Transact-SQL statements such as SELECT
 In the definition of another user-defined function
 To parameterize a view or improve the functionality of a view
 To define a column in a table (Derived-Column)
 To define a CHECK constraint on a column
 Limitations
 Cannot return multiple result sets.
 Use a stored procedure if you need to return multiple result sets.
 Cannot use @ERROR or RAISERROR.
 Cannot call a stored procedure.

3
Components of a UDF
 Have a two-part structure
 Header and
 Body.
 The header defines:
 Function name
 Input parameter name and data type
 Return parameter data type and optional name
 The body defines the action, or logic, the function is to
perform

4
Parameters
 A function takes zero or more input parameters
 The return value can either be a single scalar value or a
result set (table)
 Optional parameters can be used
 The DEFAULT keyword is used when the function is called to
retrieve the default value
 This is different from stored procedures in which omitting the
parameter also implies the default value.

5
Types of Functions
 Three type of functions

1. Scalar Functions
2. Table Valued Functions
A. Inline Table-Valued Function

B. Multi-statement Table-Valued Function

6
Scalar Functions - Syntax
CREATE FUNCTION function_name
( [ @parameterName dataType [ = default ] [ ,...n ] ] )
RETURNS returnDataType
AS
BEGIN
function_body
RETURN scalar_expression
END

7
Scalar Functions (cont.)
 Returns a single data value of the type defined in the
RETURNS clause.
 The return type can be any data type except text, ntext,
image, cursor, and timestamp
 Using Scalar Functions
 Can be used anywhere that a scalar expression of the same
data type is allowed
 Invoked by using at least the two-part name of the function

8
Scalar Functions – Example 1
CREATE FUNCTION extractLastName ( @fullName varchar(100) )
RETURNS varchar(50)
AS
BEGIN
DECLARE @tempFullName varchar(100)
DECLARE @lastName varchar(50)
DECLARE @spcPosition int

SET @tempFullName = LTrim(RTrim(@fullName))


SET @spcPosition = CHARINDEX( ' ', @tempFullName)

IF(@spcPosition > 0)
SET @lastName = SUBSTRING(@tempFullName, @spcPosition + 1
, LEN(@tempFullName))
ELSE
SET @lastName = ''
RETURN(@lastName);
END
9
Scalar Functions – Example 2
CREATE FUNCTION getTotalSalary (@depId int)
RETURNS decimal(8,2)
AS
BEGIN
DECLARE @totSalary decimal(8,2)
SELECT @totSalary = SUM(Salary)
FROM Employee
WHERE DepID = @depId

RETURN @totSalary
END

10
Scalar Functions – Example 3
CREATE FUNCTION getMyKindOfDate(@theDate date)
RETURNS varchar(20)
AS
BEGIN
RETURN DATENAME(D, (@theDate )
+ CASE
WHEN DAY(@theDate) IN (1, 21, 31) THEN 'st'
WHEN DAY(@theDate) IN (2, 22) THEN 'nd'
WHEN DAY(@theDate) IN (3, 23) THEN 'rd'
ELSE 'th'
END
+''
+ DATENAME(MONTH, (@theDate )+ ' '
+ DATENAME(yy, (@theDate )
END
11
Calling Scalar Functions
SELECT dbo.GetFullName(fName, LName) AS
EmployeeName
FROM Employee
WHERE dbo.getNetSalary(Salary) > 5000.00

UPDATE Employee
SET Salary = dbo.CalculateNewSalary(EmpID)

 SELECT dbo.funcTotalSalary(1)
 SELECT dbo.detDefaultDate()
 SELECT dbo.getMyKindOfDate(GETDATE())
 SELECT dbo.getFirstName('Abebe Kassa')

12
Scalar UDF – Example 4
CREATE FUNCTION avSalary (@jobType VARCHAR(50))
RETURNS FLOAT
AS
BEGIN
RETURN ( SELECT AVG(Salary) FROM Employee
WHERE Occupation = @jobType )
END

- - using the function

SELECT EmployeeID, FirstName


FROM Employee
WHERE Salary >= dbo. avSalary(Occupation)

13
Scalar UDF – Example 5
CREATE FUNCTION sales .calcSellingPrice(
@quantity INT,
@uPrice DEC(10,2),
@discount DEC(4,2)
)
RETURNS DEC(10,2)
AS
BEGIN
RETURN @quantity * @uPrice * (1 - @discount)
END
- - using the function
SELECT Order_id
, SUM(sales.calcSellingPrice(Quantity, UPrice, Discount)) Amount
FROM OrderItem
GROUP BY Order_id
ORDER BY Amount DESC
14
Scalar UDF – Example 6
CREATE FUNCTION funcSalesCount ( @EmployeeID int )
RETURNS INT
AS
BEGIN
DECLARE @count int

SELECT @ count = count(*)


FROM Sales
WHERE EmployeeID = @EmployeeID

RETURN @ count
END

- - using the function


SELECT FirstName, LastName
FROM Sales JOIN Employee ON Sales.EmployeeID = Employee . EmployeeID
WHERE dbo. funcSalesCount(EmployeeID) > 10
- - you can do this using GROUP BY !!!!

15
Inline Table-Valued Function
 An Inline Table-Valued Function specifies a single SELECT
statement
 Can be seen as a VIEW with parameters
 Always returns TABLE
 The table is the result set of a single SELECT statement
 There is no function body (no BEGIN … END)
 Do NOT need the TWO-PART name when using the function

16
Inline Table-Valued UDF (cont.)
CREATE FUNCTION funcEmpByDepartment (@depId int)
RETURNS TABLE
AS
RETURN
(
SELECT E.FName, E.LName, E.Salary, D.DepName
FROM Employee AS E
JOIN Department AS D ON D.DepID = E.DepID
WHERE D.DepID = @depId
)
 Using the function:
SELECT * FROM dbo.funcEmpByDepartment(2)
SELECT FName , Lname FROM dbo.funcEmpByDepartment(2)

17
Inline Table-Valued UDF (cont.)
CREATE FUNCTION funcTableColumns(@tableName varchar(100))
RETURNS TABLE
AS
RETURN
(
SELECT sc.name
FROM SysColumns sc
JOIN SysObjects so ON sc.id = so.id
WHERE so.name = @tableName
)

Using the function:


SELECT * FROM funcTableColumns('Employee')

18
Inline Table-Valued UDF (cont.)
CREATE FUNCTION funContactSearch (@LastName varchar(50))
RETURNS TABLE
AS
RETURN
(SELECT LastName + ‘ ‘ + FirstName AS Name
, ea.EmailAddress
FROM Person as p JOIN EmailAddress ea
ON ea.PID = p.PID
WHERE LastName Like @LastName + ‘%’);
GO

Using the function:


SELECT * FROM funContactSearch(‘Ad')

19
Multi-Statement Table-Valued UDF
 Return a table data type
 A TABLE variable is used
 To define the structure (columns) of the table
 To insert the rows that should be returned
 The function body is defined in a BEGIN...END block
 A RETURN statement is used without a return value
 Do NOT need the TWO-PART name when using the
function

20
Multi-Statement Table-Valued UDF
CREATE FUNCTION GetEmployeesByDepartment (@myDepID INT)
RETURNS @empList TABLE
( EmployeeID int primary key NOT NULL
, EmpName varchar(100) NOT NULL
, Department varchar(100) NOT NULL
)
AS
BEGIN
INSERT @empList
SELECT E.EmpID, E.FirstName + ' ' + E.LastName, D.DepName
FROM Employee E JOIN Department D ON E.DepID = D.DepID
WHERE D.DepID = @myDepID
RETURN
END;

21
Multi-Statement Table-Valued UDF
 Using the function:

SELECT EmployeeID , EmpName , Department


FROM dbo.GetEmployeesByDepartment(1)

22
Exercise
 Create an inline table valued function that will return the
list of all employee names that are working in a
department when given the ID of the department
 Write a User Defined Function that can be used to
convert the letter grade to numeric
 (i.e. A=4, B=3, C=2, D=1, otherwise 0)

23
Exercise (cont.)
 Write an Inline Table-Valued user-defined function that can be used instead of the
following function
CREATE FUNCTION GetEmpData (@depID INT)
RETURNS @empList TABLE
(
EmployeeID int primary key NOT NULL
, EmpName varchar(100) NOT NULL
, Department varchar(100) NOT NULL
)
AS
BEGIN
INSERT @empList
SELECT E.EmpID, E.FirstName + ' ' + E.LastName, D.DepName
FROM Employee E JOIN Department D ON E.DepID = D.DepID
WHERE D.DepID = @depID

RETURN
END

24

You might also like