In SQL Server, a function is a database object that performs
a predefined operation and returns a value. Functions can take zero or more
input parameters, perform a specific action, and return a value to the calling
statement. They can be used in SELECT statements, WHERE clauses, JOINs, etc.
Advantages of SQL Server Functions
- Code Reusability - Functions can be reused in multiple
queries, reducing redundant code.
- Abstraction - Functions abstract complex logic, making
SQL queries easier to read and maintain.
- Performance - When used properly, they can optimize
queries by offloading complex calculations to a centralized function.
- Modularity - Functions allow for modular programming,
making it easier to debug and maintain the code.
Types of SQL Server Functions
- Scalar Functions - Return a single value, such as an
integer, string, date, etc. They are called in queries like any other value.
Example - LEN(), GETDATE(), UPPER() etc.
- Table-Valued Functions (TVF) - Return a table data
type. These can be used like a table in SELECT queries, JOINs, etc.
- Example - dbo.fnGetEmployeeDetails() could return a
table containing employee details.
Creating a Function in SQL Server
Here is an example of creating a Scalar Function and a Table-Valued Function.
1. Scalar Function Example
This function calculates the age of a person given their birth date.
CREATE FUNCTION dbo.fnCalculateAge (@BirthDate DATE)
RETURNS INT
AS
BEGIN
DECLARE @Age INT;
SET @Age = DATEDIFF(YEAR, @BirthDate, GETDATE())
- CASE
WHEN MONTH(@BirthDate) > MONTH(GETDATE()) OR (MONTH(@BirthDate) = MONTH(GETDATE()) AND DAY(@BirthDate) > DAY(GETDATE()))
THEN 1 ELSE 0
END;
RETURN @Age;
END;
To use this function
SELECT dbo.fnCalculateAge('1990-05-15') AS Age;
2. Table-Valued Function Example
This function returns a list of employees in a given department.
CREATE FUNCTION dbo.fnGetEmployeesByDepartment (@DepartmentId INT)
RETURNS TABLE
AS
RETURN
(
SELECT EmployeeID, FirstName, LastName
FROM Employees
WHERE DepartmentID = @DepartmentId
);
To use this function in a query
SELECT * FROM dbo.fnGetEmployeesByDepartment(1);
Functions can be used in SELECT, INSERT,
UPDATE, DELETE, and other SQL operations.
UPDATE Employees
SET Age = dbo.fnCalculateAge(BirthDate)
WHERE BirthDate IS NOT NULL;
Limitation of SQL Server Function
SQL Server functions have several limitations or restrictions that you should
be aware of when using them. These limitations impact how you design and
implement your functions in SQL Server. Below are the key limitations of SQL
Server functions:
Limitations of SQL Server Functions
1. No Data Modification (for Scalar Functions):
- No INSERT, UPDATE, or DELETE statements are allowed inside a scalar
function.
- Scalar functions cannot change any data in the database. They are meant
to return a computed value based on input parameters but cannot modify
tables or rows directly.
Example of Disallowed Operation
CREATE FUNCTION dbo.fnExample()
RETURNS INT
AS
BEGIN
UPDATE Employees -- This is not allowed
SET Age = 30
WHERE EmployeeID = 1;
RETURN 1;
END;
2. No TRIGGERS, COMMIT, or ROLLBACK Statements:
- Functions cannot include transaction control commands like COMMIT or
ROLLBACK.
- Functions cannot invoke triggers directly or perform actions that affect
the database's transactional state.
3. Cannot Modify Schema:
- Functions cannot perform actions like adding, dropping, or altering
database objects (e.g., tables, indexes, or views).
4. No OUTPUT Parameters:
- Unlike stored procedures, functions in SQL Server cannot have OUTPUT
parameters. They return only a single value or table.
- The value returned by a function is always specified via the RETURN
statement (for scalar functions) or as the result set (for table-valued
functions).
5. Limited Access to System and Session Variables:
- Functions do not have access to session-level settings (like SET
options), nor can they directly modify session variables.
- Some global system functions such as GETDATE() or NEWID() are
accessible, but system-level states are typically not available in
functions.
6. Performance Overhead:
- Scalar functions, particularly when used in large queries, can lead to
performance issues. This is because SQL Server may execute the scalar
function row by row, which can slow down queries.
- Inline table-valued functions generally perform better than scalar
functions because they can be optimized by SQL Server's query planner.
7. Cannot Use Temporary Tables:
- Functions cannot create or use temporary tables (#tempTable). While you
can declare table variables, you cannot perform complex operations that rely
on temporary storage.
8. No WAITFOR or SLEEP:
- Functions cannot include commands like WAITFOR DELAY or WAITFOR TIME to
introduce delays.
Next