SQL Server - 全局临时表与普通表

Ano*_*ous 1 sql-server temporary-tables

我有一个存储过程,用于将 csv 文件加载到 SQL Server。这将最初将文件批量插入到全局临时表中,然后在最后执行:

select cast(column1 as int) [column1], column2, column3... into table from ##temptable
Run Code Online (Sandbox Code Playgroud)

然后继续删除 ##temptable

在查询之前,select into table from ##temptableselect对临时表运行了一系列查询以确定列应该是什么类型(我相信这可以正常工作)。

请注意,在创建最终输出表之前拥有一个表(正常的或临时的)对于存储过程至关重要。

我想知道的是,我是否最好使用全局临时表,或者我应该使用普通表还是没有区别?

我看过几篇关于临时表和表变量之间差异的文章,但是在将全局临时表与普通表进行比较时我什么也没看到,而且我很难在我的环境中正确地测试它。

Dav*_*oft 5

普通表会导致在您的数据库中进行日志记录,消耗空间,并且每次提交时都需要刷新日志。所以对于临时数据,应该使用临时表。

但是您通常会在此处使用常规 (#) 临时表,而不是全局 (##) 临时表。

全局临时表在(非常罕见的)场景中很有用,其中多个单独的会话需要访问同一个临时表。全局临时表可能有用的另一种情况是临时表是在动态 SQL 中创建的,但在调用批处理中被引用,例如:

exec ('select * into ##foo from sys.objects')
select * from ##foo
Run Code Online (Sandbox Code Playgroud)

但是在存储过程中创建临时表并在动态 SQL 中访问它不需要全局临时表,例如:

create table #foo(id int, data varchar(200))
exec ('insert into #foo(id,data) values (1,''hello'')')
select * from #foo
Run Code Online (Sandbox Code Playgroud)

并且当你在存储过程中创建一个普通的临时表时,它会在存储过程结束时自动销毁,并且你可以运行同一过程的多个实例而不会相互干扰。