Dynamic SQL in T-SQL (Transact-SQL, used in Microsoft SQL Server) is used to construct and execute SQL statements at runtime. This is particularly useful when the SQL query needs to be generated dynamically based on varying conditions, user inputs, or other runtime parameters.
How to Write and Execute Dynamic SQL in T-SQL
There are two primary ways to execute dynamic SQL in T-SQL:
- Using
EXEC
: The simplest way to execute a dynamic SQL statement is by using theEXEC
command. - Using
sp_executesql
: This method is more flexible and secure, as it allows parameterization of the dynamic SQL, which helps prevent SQL injection.
Examples
Example using EXEC
DECLARE @TableName NVARCHAR(50)
DECLARE @SQL NVARCHAR(MAX)
SET @TableName = N'Employees'
SET @SQL = N'SELECT * FROM ' + @TableName
EXEC(@SQL)
Example using sp_executesql
DECLARE @TableName NVARCHAR(50)
DECLARE @SQL NVARCHAR(MAX)
DECLARE @Column NVARCHAR(50)
DECLARE @Value NVARCHAR(50)
SET @TableName = N'Employees'
SET @Column = N'LastName'
SET @Value = N'Smith'
SET @SQL = N'SELECT * FROM ' + @TableName + ' WHERE ' + @Column + ' = @Value'
EXEC sp_executesql @SQL, N'@Value NVARCHAR(50)', @Value
Using Parameters to Prevent SQL Injection
One of the main benefits of using sp_executesql
over EXEC
is the ability to parameterize the SQL query, which helps prevent SQL injection attacks. Here’s an example:
DECLARE @TableName NVARCHAR(50)
DECLARE @SQL NVARCHAR(MAX)
DECLARE @LastName NVARCHAR(50)
SET @TableName = N'Employees'
SET @LastName = N'Smith'
SET @SQL = N'SELECT * FROM ' + @TableName + ' WHERE LastName = @LastName'
EXEC sp_executesql @SQL, N'@LastName NVARCHAR(50)', @LastName
Dynamic SQL with OUTPUT Parameters
sp_executesql
also supports output parameters. Here’s an example of using an output parameter:
DECLARE @SQL NVARCHAR(MAX)
DECLARE @AvgSalary MONEY
DECLARE @DepartmentID INT
SET @DepartmentID = 1
SET @SQL = N'SELECT @AvgSalary = AVG(Salary) FROM Employees WHERE DepartmentID = @DeptID'
EXEC sp_executesql @SQL, N'@DeptID INT, @AvgSalary MONEY OUTPUT', @DeptID = @DepartmentID, @AvgSalary = @AvgSalary OUTPUT
PRINT @AvgSalary
Best Practices for Using Dynamic SQL in T-SQL
- Use
sp_executesql
with Parameters: Always usesp_executesql
with parameters to avoid SQL injection. - Validate Input: Validate all user inputs and ensure they are properly sanitized before including them in dynamic SQL.
- Use QUOTENAME: When dynamically constructing SQL object names (like table or column names), use the
QUOTENAME
function to properly escape them and prevent SQL injection. - Limit the Use of Dynamic SQL: Use dynamic SQL only when necessary. Static SQL is easier to read, maintain, and optimize.
Here’s an example that demonstrates the use of QUOTENAME
:
DECLARE @TableName NVARCHAR(50)
DECLARE @SQL NVARCHAR(MAX)
SET @TableName = N'Employees'
SET @SQL = N'SELECT * FROM ' + QUOTENAME(@TableName)
EXEC sp_executesql @SQL
By following these best practices, you can safely and effectively use dynamic SQL in T-SQL to handle complex querying requirements that static SQL cannot easily address.