T-SQL Tutorial

Table variables in SQL Server

SQL Server table variables are a type of variable available for use in SQL Server that allow for the temporary storage of a set of rows and columns of data. They are similar to temporary tables, but there are key differences in their behavior and scope that can influence their use in database operations. They are often used within stored procedures, functions, or batches. Table variables provide a convenient way to store and process intermediate results without the need to create temporary tables in the tempdb database. Here's an overview of table variables in SQL Server:


A table variable is defined within a batch or stored procedure using the DECLARE statement followed by a table structure definition. The syntax for declaring a table variable is similar to creating a new table, although there are limitations to the table structure that can be defined.


The basic syntax for declaring a table variable is as follows:

DECLARE @MyTableVariable TABLE (
Column1 DataType1,
Column2 DataType2,

Features and Usage

Scope: The scope of a table variable is limited to the batch, stored procedure, or function in which it is declared. It is automatically cleaned up at the end of the execution.
Performance: Table variables can be faster for smaller datasets due to their minimal logging and lack of statistics. However, this can also be a drawback for larger datasets or complex queries because the optimizer lacks detailed information to make the best execution plan decisions.
Transaction Behavior: Changes made to table variables are not part of the transaction log, meaning they cannot be rolled back. This behavior can be beneficial in certain scenarios where you do not want the operations on the table variable to affect transaction control.
Indexes: By default, table variables have a primary key index if a primary key is defined during declaration. Starting with SQL Server 2014 (version 12.x), non-clustered indexes can be added to table variables by defining them within the table declaration using the INDEX keyword.

When to Use

For temporary data storage where the dataset is relatively small.
When transaction rollback for the temporary data is not required.
In scenarios where the temporary data does not benefit significantly from the query optimization that comes with statistics.


Statistics: SQL Server does not automatically create statistics on table variables, which can lead to less optimal query plans compared to temporary tables.
Large Data Sets: For operations involving large amounts of data, temporary tables might be a better choice due to their support for statistics and better optimization by the query planner.
Debugging and Performance Tuning: The lack of statistics and visibility in some tools can make performance tuning and debugging more challenging when using table variables.


Here is a simple example of how to declare and use a table variable in SQL Server:

DECLARE @EmployeeTable TABLE (
EmployeeID INT,
Name NVARCHAR(50),
Position NVARCHAR(50)

INSERT INTO @EmployeeTable (EmployeeID, Name, Position)
VALUES (1, 'John Doe', 'Software Developer'),
(2, 'Jane Smith', 'Project Manager');

SELECT * FROM @EmployeeTable;

This example demonstrates creating a table variable, inserting data into it, and then selecting the data. Table variables provide a powerful tool for managing temporary data in SQL Server, but understanding their characteristics and limitations is crucial for their effective use.