SQL Server Functions: A Comprehensive
Guide
Dr M AOUDE
February 4, 2025
Contents
1 Introduction to SQL Server Functions 3
1.1 Key Characteristics . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Introduction to SQL Server Functions 3
3 Types of SQL Server Functions 3
3.1 Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . . 3
3.1.1 Aggregate Functions . . . . . . . . . . . . . . . . . . . 3
3.1.2 Date and Time Functions . . . . . . . . . . . . . . . . 4
3.1.3 String Functions . . . . . . . . . . . . . . . . . . . . . 4
3.2 User-Dened Functions . . . . . . . . . . . . . . . . . . . . . . 4
3.2.1 Scalar Functions . . . . . . . . . . . . . . . . . . . . . 4
3.2.2 Inline Table-Valued Functions . . . . . . . . . . . . . . 5
4 Types of SQL Server Functions 5
4.1 Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . . 5
4.1.1 Aggregate Functions . . . . . . . . . . . . . . . . . . . 5
4.1.2 Date and Time Functions . . . . . . . . . . . . . . . . 5
4.1.3 String Functions . . . . . . . . . . . . . . . . . . . . . 6
4.1.4 Mathematical Functions . . . . . . . . . . . . . . . . . 6
4.1.5 Ranking Functions . . . . . . . . . . . . . . . . . . . . 6
4.2 User-Dened Functions . . . . . . . . . . . . . . . . . . . . . . 6
4.2.1 Scalar Functions . . . . . . . . . . . . . . . . . . . . . 6
4.2.2 Inline Table-Valued Functions . . . . . . . . . . . . . . 7
4.2.3 Multi-Statement Table-Valued Functions . . . . . . . . 8
5 CLR Functions 9
5.1 Enable CLR Support . . . . . . . . . . . . . . . . . . . . . . . 9
1
6 CLR Functions 9
6.1 Enabling CLR Support . . . . . . . . . . . . . . . . . . . . . . 9
6.2 Example CLR Function . . . . . . . . . . . . . . . . . . . . . 9
7 Deterministic vs Nondeterministic Functions 10
7.1 Deterministic Functions . . . . . . . . . . . . . . . . . . . . . 10
7.2 Nondeterministic Functions . . . . . . . . . . . . . . . . . . . 10
8 Deterministic vs Nondeterministic Functions 10
8.1 Deterministic Functions . . . . . . . . . . . . . . . . . . . . . 10
8.2 Nondeterministic Functions . . . . . . . . . . . . . . . . . . . 11
9 Best Practices 11
9.1 Performance Considerations . . . . . . . . . . . . . . . . . . . 11
9.2 Security Considerations . . . . . . . . . . . . . . . . . . . . . 11
10 Best Practices 11
10.1 Schema Binding . . . . . . . . . . . . . . . . . . . . . . . . . . 11
10.2 Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . 12
10.3 Performance Considerations . . . . . . . . . . . . . . . . . . . 12
11 Conclusion 12
11.1 Example CLR Function . . . . . . . . . . . . . . . . . . . . . 13
12 Key Takeaways 13
2
1 Introduction to SQL Server Functions
A function in SQL Server is a reusable code module that accepts parameters
and returns a value or result set. Unlike stored procedures, functions can be
used within SELECT statements and WHERE clauses.
1.1 Key Characteristics
Always returns a value or result set
Can be used in SELECT statements and WHERE clauses
Stored as an object in the database
Can accept parameters
Note
Unlike stored procedures, functions must be called without EXE-
CUTE keyword and must return a value.
2 Introduction to SQL Server Functions
A function in SQL Server is a reusable code module that accepts parameters
and returns a value or result set. Unlike stored procedures, functions can be
used within SELECT statements and WHERE clauses. Here's a key dierence:
1 -- Using a function
2 SELECT FirstName, LastName, [Link](BirthDate) AS Age
3 FROM Employees;
4
5 -- Using a stored procedure (requires EXECUTE)
6 EXECUTE GetEmployeeAge @EmployeeID = 1;
3 Types of SQL Server Functions
3.1 Built-in Functions
3.1.1 Aggregate Functions
These functions perform calculations across a set of rows:
1 SELECT
2 COUNT(*) AS TotalEmployees,
3 AVG(Salary) AS AverageSalary,
4 MAX(Salary) AS HighestSalary,
5 MIN(Salary) AS LowestSalary,
3
6 SUM(Salary) AS TotalPayroll
7 FROM Employees;
3.1.2 Date and Time Functions
Functions for manipulating date and time values:
1 SELECT
2 GETDATE() AS CurrentDateTime,
3 DATEADD(YEAR, 1, GETDATE()) AS OneYearFromNow,
4 DATEDIFF(YEAR, '1990-01-01', GETDATE())
5 AS YearsSince1990,
6 DATEPART(MONTH, GETDATE()) AS CurrentMonth,
7 EOMONTH(GETDATE()) AS LastDayOfMonth;
3.1.3 String Functions
Functions for string manipulation:
1 SELECT
2 SUBSTRING('Hello World', 1, 5) AS FirstWord,
3 LEFT('Hello World', 5) AS LeftFive,
4 RIGHT('Hello World', 5) AS RightFive,
5 LEN('Hello World') AS StringLength,
6 REPLACE('Hello World', 'Hello', 'Hi')
7 AS ReplacedString;
3.2 User-Dened Functions
3.2.1 Scalar Functions
Returns a single value based on the input parameters:
1 CREATE FUNCTION CalculateAge
2 (
3 @BirthDate DATE
4 )
5 RETURNS INT
6 WITH SCHEMABINDING
7 AS
8 BEGIN
9 RETURN DATEDIFF(YEAR, @BirthDate, GETDATE()) -
10 CASE
11 WHEN (MONTH(@BirthDate) > MONTH(GETDATE()))
12 OR (MONTH(@BirthDate) = MONTH(GETDATE())
13 AND DAY(@BirthDate) > DAY(GETDATE()))
14 THEN 1
15 ELSE 0
4
16 END
17 END;
3.2.2 Inline Table-Valued Functions
Returns a table result set:
1 CREATE FUNCTION GetEmployeesByDepartment
2 (
3 @DepartmentID INT
4 )
5 RETURNS TABLE
6 AS
7 RETURN
8 (
9 SELECT
10 EmployeeID,
11 FirstName,
12 LastName,
13 Salary
14 FROM
15 Employees
16 WHERE
17 DepartmentID = @DepartmentID
18 );
4 Types of SQL Server Functions
4.1 Built-in Functions
4.1.1 Aggregate Functions
These functions perform calculations across sets of rows:
1 SELECT
2 COUNT(*) AS TotalEmployees,
3 AVG(Salary) AS AverageSalary,
4 MAX(Salary) AS HighestSalary,
5 MIN(Salary) AS LowestSalary,
6 SUM(Salary) AS TotalPayroll
7 FROM Employees;
4.1.2 Date and Time Functions
Functions for manipulating date and time values:
1 SELECT
2 GETDATE() AS CurrentDateTime,
5
3 DATEADD(YEAR, 1, GETDATE()) AS OneYearFromNow,
4 DATEDIFF(YEAR, '1990-01-01', GETDATE()) AS YearsSince1990,
5 DATEPART(MONTH, GETDATE()) AS CurrentMonth,
6 EOMONTH(GETDATE()) AS LastDayOfMonth;
4.1.3 String Functions
Functions for string manipulation:
1 SELECT
2 SUBSTRING('Hello World', 1, 5) AS FirstWord,
3 LEFT('Hello World', 5) AS LeftFive,
4 RIGHT('Hello World', 5) AS RightFive,
5 LEN('Hello World') AS StringLength,
6 REPLACE('Hello World', 'Hello', 'Hi') AS ReplacedString;
4.1.4 Mathematical Functions
Functions for numerical calculations:
1 SELECT
2 ABS(-42) AS AbsoluteValue,
3 POWER(2, 3) AS TwoToThirdPower,
4 SQRT(16) AS SquareRoot,
5 ROUND(3.14159, 2) AS RoundedPi,
6 CEILING(3.1) AS CeilingValue,
7 FLOOR(3.9) AS FloorValue;
4.1.5 Ranking Functions
Functions for ranking rows within result sets:
1 SELECT
2 EmployeeName,
3 Salary,
4 ROW_NUMBER() OVER (ORDER BY Salary DESC) AS SalaryRank,
5 DENSE_RANK() OVER (ORDER BY Salary DESC) AS DenseRank,
6 NTILE(4) OVER (ORDER BY Salary DESC) AS Quartile
7 FROM Employees;
4.2 User-Dened Functions
4.2.1 Scalar Functions
Functions that return a single value:
6
1 -- Create a function to calculate age
2 CREATE FUNCTION CalculateAge
3 (
4 @BirthDate DATE
5 )
6 RETURNS INT
7 WITH SCHEMABINDING
8 AS
9 BEGIN
10 RETURN DATEDIFF(YEAR, @BirthDate, GETDATE()) -
11 CASE
12 WHEN (MONTH(@BirthDate) > MONTH(GETDATE())) OR
13 (MONTH(@BirthDate) = MONTH(GETDATE()) AND
14 DAY(@BirthDate) > DAY(GETDATE()))
15 THEN 1
16 ELSE 0
17 END
18 END;
19
20 -- Use the function
21 SELECT
22 FirstName,
23 LastName,
24 BirthDate,
25 [Link](BirthDate) AS Age
26 FROM Employees;
4.2.2 Inline Table-Valued Functions
Functions that return a table result set:
1 -- Create a function that returns employees by department
2 CREATE FUNCTION GetEmployeesByDepartment
3 (
4 @DepartmentID INT
5 )
6 RETURNS TABLE
7 AS
8 RETURN
9 (
10 SELECT
11 EmployeeID,
12 FirstName,
13 LastName,
14 Salary
15 FROM
16 Employees
17 WHERE
7
18 DepartmentID = @DepartmentID
19 );
20
21 -- Use the function
22 SELECT * FROM [Link](5);
4.2.3 Multi-Statement Table-Valued Functions
Functions that use multiple statements to return a table:
1 CREATE FUNCTION GetEmployeePerformance
2 (
3 @Year INT
4 )
5 RETURNS @Results TABLE
6 (
7 EmployeeID INT,
8 EmployeeName NVARCHAR(100),
9 SalesTotal DECIMAL(18,2),
10 CommissionEarned DECIMAL(18,2)
11 )
12 AS
13 BEGIN
14 INSERT INTO @Results
15 SELECT
16 [Link],
17 [Link] + ' ' + [Link],
18 SUM([Link]),
19 SUM([Link] * [Link])
20 FROM
21 Employees E
22 JOIN Sales S ON [Link] = [Link]
23 WHERE
24 YEAR([Link]) = @Year
25 GROUP BY
26 [Link], [Link], [Link],
27 [Link];
28
29 RETURN;
30 END;
31
32 -- Use the function
33 SELECT * FROM [Link](2023);
8
5 CLR Functions
5.1 Enable CLR Support
Before using CLR functions, enable CLR support on the server:
1 sp_configure 'clr_enabled', 1;
2 GO
3 RECONFIGURE;
4 GO
6 CLR Functions
6.1 Enabling CLR Support
Before using CLR functions, enable CLR support on the server:
1 sp_configure 'clr_enabled', 1;
2 GO
3 RECONFIGURE;
4 GO
6.2 Example CLR Function
Here's an example of a CLR function written in C#:
1 using [Link];
2 using [Link];
3
4 public partial class UserDefinedFunctions
5 {
6 [SqlFunction(IsDeterministic = true)]
7 public static SqlDouble CalculateDistance
8 (
9 SqlDouble latitude1,
10 SqlDouble longitude1,
11 SqlDouble latitude2,
12 SqlDouble longitude2
13 )
14 {
15 // Implementation here
16 return new SqlDouble(/* result */);
17 }
18 }
9
7 Deterministic vs Nondeterministic Functions
7.1 Deterministic Functions
Functions that always return the same result for the same input:
1 CREATE FUNCTION SquareNumber(@num INT)
2 RETURNS INT
3 WITH SCHEMABINDING
4 AS
5 BEGIN
6 RETURN @num * @num
7 END;
7.2 Nondeterministic Functions
Functions that may return dierent results for the same input:
1 CREATE FUNCTION GenerateRandomPrice
2 (
3 @BasePrice DECIMAL(18,2)
4 )
5 RETURNS DECIMAL(18,2)
6 AS
7 BEGIN
8 RETURN @BasePrice * (1 + (RAND() * 0.2))
9 END;
8 Deterministic vs Nondeterministic Functions
8.1 Deterministic Functions
Functions that always return the same result for the same input:
1 CREATE FUNCTION SquareNumber
2 (
3 @num INT
4 )
5 RETURNS INT
6 WITH SCHEMABINDING
7 AS
8 BEGIN
9 RETURN @num * @num;
10 END;
10
8.2 Nondeterministic Functions
Functions that may return dierent results for the same input:
1 -- Built-in nondeterministic function
2 SELECT GETDATE();
3
4 -- Custom nondeterministic function
5 CREATE FUNCTION GenerateRandomPrice
6 (
7 @BasePrice DECIMAL(18,2)
8 )
9 RETURNS DECIMAL(18,2)
10 AS
11 BEGIN
12 RETURN @BasePrice * (1 + (RAND() * 0.2));
13 END;
9 Best Practices
9.1 Performance Considerations
Use schema binding when possible
Prefer inline table-valued functions over multi-statement
Be cautious with CLR functions in heavy-use scenarios
Consider indexing implications for deterministic functions
9.2 Security Considerations
Use appropriate EXECUTE AS context
Consider encryption for sensitive logic
Grant minimum required permissions
10 Best Practices
10.1 Schema Binding
Use schema binding when possible to improve performance and maintain-
ability:
1 CREATE FUNCTION [Link]
2 (
3 @FirstName NVARCHAR(50),
4 @LastName NVARCHAR(50)
11
5 )
6 RETURNS NVARCHAR(101)
7 WITH SCHEMABINDING
8 AS
9 BEGIN
10 RETURN @FirstName + ' ' + @LastName;
11 END;
10.2 Error Handling
Implement proper error handling in functions:
1 CREATE FUNCTION [Link]
2 (
3 @Numerator DECIMAL(18,2),
4 @Denominator DECIMAL(18,2)
5 )
6 RETURNS DECIMAL(18,2)
7 WITH SCHEMABINDING
8 AS
9 BEGIN
10 IF @Denominator = 0
11 RETURN NULL;
12
13 RETURN @Numerator / @Denominator;
14 END;
10.3 Performance Considerations
Choose the appropriate function type for optimal performance:
1 -- Good: Use inline table-valued functions instead of
2 -- multi-statement when possible
3 CREATE FUNCTION GetActiveEmployees()
4 RETURNS TABLE
5 AS
6 RETURN
7 (
8 SELECT *
9 FROM Employees
10 WHERE Status = 'Active'
11 );
11 Conclusion
SQL Server functions are powerful tools for:
12
Code reusability
Data consistency
Performance optimization
Business logic implementation
When used correctly, they can signicantly improve database design and
application performance.
11.1 Example CLR Function
Example of a CLR function written in C#:
1 using [Link];
2 using [Link];
3
4 public partial class UserDefinedFunctions
5 {
6 [SqlFunction(IsDeterministic = true)]
7 public static SqlDouble CalculateDistance
8 (
9 SqlDouble latitude1,
10 SqlDouble longitude1,
11 SqlDouble latitude2,
12 SqlDouble longitude2
13 )
14 {
15 // Haversine formula implementation
16 // Returns distance in kilometers
17 return new SqlDouble(0.0); // Placeholder return
18 }
19 }
12 Key Takeaways
Functions must always return a value
They can be used in SELECT statements and WHERE clauses
Schema binding helps with performance and maintainability
Inline table-valued functions generally perform better than multi-statement
ones
Be cautious with nondeterministic functions in computed columns or
indexes
CLR functions are ideal for complex calculations or external operations
13