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

Posted

技术标签:

【中文标题】如何在 SQL Server 中使用 Create 语句创建临时表?【英文标题】:How to create temp table using Create statement in SQL Server? 【发布时间】:2017-08-19 00:00:58 【问题描述】:

如何像创建普通表一样创建临时表?

例子:

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

【问题讨论】:

在表名前加# simple-talk.com/sql/t-sql-programming/… 我投票结束这个问题,因为它可以通过简单的谷歌搜索来回答 【参考方案1】:

同样的,表名以###开头:

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)
    ....
);

临时表名以###开头——第一个是本地临时表,最后一个是全局临时表。

Here 是描述它们之间差异的众多文章之一。

【讨论】:

【参考方案2】:

一个临时表可以有3种,#是最常用的。这是一个仅存在于当前会话中的临时表。 与此等效的是@,它是一个声明的表变量。这具有较少的“功能”(如索引等),并且也仅用于当前会话。 ### 相同,但是范围更广,因此您可以在同一会话中,在其他存储过程中使用它。

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

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

【讨论】:

session 的使用不正确...@table 与任何变量一样 - 绑定到一项作业。它会随着GO 而消失,并且被调用的 SP 或函数不知道它。 #table 将存在于一个会话中,即使在被调用的 SP 或函数中,而 ##table 可以从不同的会话中访问。 另外,表变量不是临时表。阅读 Martin Smith 的post on DBO.StackExchange about it 了解详情。 表变量由于缺乏索引和统计信息,通常会导致执行计划不佳。它们的范围是当前的 batch,而不是“作业”或会话。虽然它们有其用途,但它们通常不是临时表的最佳选择。 表变量是临时表,而不是在 tempdb 中创建的表。但是,即使是 @ 表也使用 tempdb(请参阅 blog.sqlauthority.com/2009/12/15/…) 表变量与临时表不同。它们完全不同。此外,可以在不同的会话中访问全局临时表 (##),如果我没记错的话,也可以通过不同的登录名访问。

以上是关于如何在 SQL Server 中使用 Create 语句创建临时表?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 你可以在 CREATE TABLE 中添加字段描述吗?

SQL Server 中“CREATE TABLE table AS”中的“分发选项”错误

SQL Server CREATE语句

python能创建sql server数据库,执行create database语句吗?

Access 可以像 SQL Server 一样生成 CREATE TABLE 脚本代码吗?

如何在 SQL Server 中找到正在运行的跟踪?