我有一个存储过程,用于将 csv 文件加载到 SQL Server。这最初会将文件批量插入到全局临时表中,然后在最后它将执行:
select cast(column1 as int) [column1], column2, column3... into table from ##temptable
然后继续删除##temptable
在查询之前,select into table from ##temptable
我对临时表运行了一系列select
查询以确定列应该是什么类型(我相信这可以正常工作)。
请注意,在创建最终输出表之前拥有一个表(普通表或临时表)对于存储过程至关重要。
我想知道的是,我是使用全局临时表更好,还是应该使用普通表,还是没有区别?
我已经看过几篇关于临时表和表变量之间差异的文章,但是在将全局临时表与普通表进行比较时,我什么也没看到,而且我很难在我的环境中正确地测试它。
一个普通的表会导致在你的数据库中记录,消耗空间,并且每次提交都需要刷新日志。所以对于临时数据,你应该使用临时表。
但是您通常会在这里使用常规 (#) 临时表,而不是全局 (##) 临时表。
全局临时表在(非常罕见的)多个单独会话需要访问同一个临时表的情况下很有用。全局临时表可能有用的另一种情况是临时表是在动态 SQL 中创建的,但在调用批处理中被引用,例如:
但是全局临时表不是在存储过程中创建临时表并在动态 SQL 中访问它的必要条件,例如:
并且当你在存储过程中创建一个普通的临时表时,它会在存储过程结束时自动销毁,并且你可以运行同一过程的多个实例而不会相互干扰。
潜在地保持数据可用有什么好处吗?例如,我见过这样的情况,当
insert
语句引发了意外错误或设置了特定的调试标志,因为它可以更轻松地解决问题和/或重新启动进程而无需重新加载文件,并且这些好处值得通过额外的日志记录来减慢负载的成本。如果您要在夜间进行仓库加载,并且加载/处理/验证暂存表中的数据需要一个小时,那么使用永久表来暂存数据可能是值得的。您可以在正常的一天使用不需要生成日志记录的临时表节省 10-15 分钟,但如果它可以在出现问题时为您节省数小时的调试和重新运行时间,那么它是值得的。如果您不打算保留临时表中的数据,那么我完全同意 David 的观点,即您应该使用临时表(并且可能是常规临时表)。