如何在SQL Server中使用CREATE语句创建临时表?

44

如何创建一个临时表,类似于创建普通表的方式?

示例:

CREATE TABLE table_name 
(
    column1 datatype,
    column2 datatype,
    column3 datatype,
     ....
 );

8
在表名前加上 # 符号。 - Hadi
1
https://www.simple-talk.com/sql/t-sql-programming/temporary-tables-in-sql-server/ - Hadi
2
我投票关闭此问题,因为它可以通过简单的谷歌搜索来回答。 - alroc
2个回答

68

同样的事情,只需以###开头即可开始表格名称:

CREATE TABLE #TemporaryTable          -- Local temporary table - starts with single #
(
    Col1 int,
    Col2 varchar(10)
    ....
);

CREATE TABLE ##GlobalTemporaryTable   -- Global temporary table - note it starts with ##.
(
    Col1 int,
    Col2 varchar(10)
    ....
);

临时表名以###开头,前者为本地临时表,后者为全局临时表。

这里是许多文章之一,描述它们之间的区别。


56

临时表可以有三种,其中最常用的是带有 # 的。这是一个仅存在于当前会话中的临时表。

相当于它的是一个已声明的表变量 @ ,它的“功能”较少(如索引等),并且也只用于当前会话。

带有 ## 的临时表与带有 # 的一样,不同之处在于作用范围更广,因此您可以在同一会话中、其他存储过程内使用它。

您可以以多种方式创建临时表:

declare @table table (id int)
create table #table (id int)
create table ##table (id int)
select * into #table from xyz

4
session 的使用方法不正确。像任何变量一样,@table 与一个作业相关联。它会随着 GO 命令的执行而消失,并且调用的存储过程(SP)或函数也无法访问它。#table 存在于一个会话中,即使在调用的存储过程或函数中也是如此,而 ##table 可以从不同的会话中访问。 - Shnugo
2
此外,表变量并不是临时表。请阅读马丁·史密斯在 DBO.StackExchange 上的帖子了解详情。 - Zohar Peled
表变量由于缺乏索引和统计信息,通常会导致执行计划不佳。它们的作用域仅限于当前批处理,而不是“作业”或会话。虽然它们有其用途,但与临时表相比,它们通常不是最佳选择。 - alroc
一个表变量是一个临时表,不是在tempdb内创建的表。然而,即使是@表也使用tempdb(参见https://blog.sqlauthority.com/2009/12/15/sql-server-difference-temptable-and-table-variable-temptable-in-memory-a-myth/)。 - Mark Kremers
一个表变量不同于临时表,它们是完全不同的。此外,全局临时表(##)可以在不同的会话中访问,如果我没记错的话,也可以被不同的登录访问。 - ATC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接