Temp Table or Table variable or CTE are commonly
used for storing data temporarily in SQL Server. In this blog, we will see the
differences among these three.
SELECT Addr.Address, Emp.Name, Emp.Age From Address
Addr
Inner join Employee
Emp on Emp.EID
= Addr.EID) Temp
WHERE Temp.Age > 50
ORDER BY Temp.NAME
;With CTE1(Address, Name, Age)--Column names for CTE, which are optional
AS
(
SELECT Addr.Address, Emp.Name, Emp.Age from Address
Addr
INNER JOIN EMP
Emp ON Emp.EID
= Addr.EID
)
SELECT * FROM CTE1 --Using
CTE
WHERE CTE1.Age > 50
ORDER BY CTE1.NAME
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Akash', 'Mumbai');
GO
Select * from #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Akash','Mumbai');
GO
Select * from ##GlobalTemp
GO
DECLARE @TProduct TABLE
(
SNo INT IDENTITY(1,1),
ProductID INT,
Qty INT
)
--Insert data to Table variable @Product
INSERT INTO @TProduct(ProductID,Qty)
SELECT DISTINCT ProductID, Qty FROM ProductsSales ORDER BYProductID ASC
--Select data
Select * from @TProduct
--Next batch
GO
Select * from @TProduct --gives error in next batch
CTE
CTE stands for Common Table expressions. It was
introduced with SQL Server 2005. It is a temporary result set and typically it
may be a result of complex sub-query. Unlike temporary table its life is
limited to the current query. It is defined by using WITH statement. CTE improves
readability and ease in maintenance of complex queries and sub-queries. Always
begin CTE with semicolon.
A sub query without CTE is given below:
SELECT * FROM (
SELECT Addr.Address, Emp.Name, Emp.Age From Address
Addr
Inner join Employee
Emp on Emp.EID
= Addr.EID) Temp
WHERE Temp.Age > 50
ORDER BY Temp.NAME
By using CTE above query can be re-written as follows
;With CTE1(Address, Name, Age)--Column names for CTE, which are optional
AS
(
SELECT Addr.Address, Emp.Name, Emp.Age from Address
Addr
INNER JOIN EMP
Emp ON Emp.EID
= Addr.EID
)
SELECT * FROM CTE1 --Using
CTE
WHERE CTE1.Age > 50
ORDER BY CTE1.NAME
----------------------------------------------------------------------------------------------------------------
When to use CTE
- This is used to store result of a complex sub query for further use.
- This is also used to create a recursive query.
Temporary Tables
In SQL Server, temporary tables are created at
run-time and you can do all the operations which you can do on a normal table.
These tables are created inside Tempdb database. Based on the scope and
behavior temporary tables are of two types as given below-
Local Temp Table
Local temp tables are only available to the SQL
Server session or connection (means single user) that created the tables. These
are automatically deleted when the session that created the tables has been
closed. Local temporary table name is stared with single hash ("#")
sign.
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Akash', 'Mumbai');
GO
Select * from #LocalTemp
Global Temp Table
Global temp tables are available to all SQL
Server sessions or connections (means all the user). These can be created
by any SQL Server connection user and these are automatically
deleted when all the SQL Server connections have been closed.
Global temporary table name is stared with double hash ("##")
sign.
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Akash','Mumbai');
GO
Select * from ##GlobalTemp
----------------------------------------------------------------------------------------------------------------
Table Variable
This acts like a variable and exists for a
particular batch of query execution. It gets dropped once
it comes out of batch. This is also created in the Tempdb database but
not the memory. This also allows you to create primary key, identity at
the time of Table variable declaration but not non-clustered index.
GO
DECLARE @TProduct TABLE
(
SNo INT IDENTITY(1,1),
ProductID INT,
Qty INT
)
--Insert data to Table variable @Product
INSERT INTO @TProduct(ProductID,Qty)
SELECT DISTINCT ProductID, Qty FROM ProductsSales ORDER BYProductID ASC
--Select data
Select * from @TProduct
--Next batch
GO
Select * from @TProduct --gives error in next batch
----------------------------------------------------------------------------------------------------------------
Note:
- Temp Tables are physically created in the "Tempdb" database. These tables act as the normal table and also can have constraints, index like normal tables.
- CTE is a named temporary result set which is used to manipulate the complex sub-queries data.This exists for the scope of statement. This is created in memory rather than "Tempdb" database.You cannot create any index on CTE.
- Table Variable acts like a variable and exists for a particular batch of query execution. It gets dropped once it comes out of batch. This is also created in the Tempdb database but not the memory.
About Author:
Akash Verma is budding technology geek, who actively contributes to Systems Plus with his creativity and research on technology. He can be contacted at akash.v@spluspl.com
Akash Verma is budding technology geek, who actively contributes to Systems Plus with his creativity and research on technology. He can be contacted at akash.v@spluspl.com
Really nice article with example helping me a lots....
ReplyDelete