我是SQL Server存储过程编码的新手。我难以在临时表,表变量,全局临时表之间进行决定,以用于在我的存储过程中存储数据。
我的情况是我需要在表中本地存储数据,以便在从各种SQL Server检索数据时计算值。常识告诉我使用临时表,但为什么我不能使用表变量或全局临时表?
任何见解都会有所帮助。
答案 0 :(得分:0)
规则非常多,选择一个表变量作为默认值。然后在以下情况下重新评估情况:
如果要使用事务回滚 如果要将表的结果集从一个存储过程传递到另一个存储过程 如果您希望查询优化器能够计算出如何最好地运行复杂查询 如果您对动态SQL非常聪明,则需要一个临时表。
因此,表变量应该是您的首选。对于小型结果集和日常类型的数据操作,它们比临时表更快,更灵活,服务器在您完成后清理它们。 与temp表不同,temp变量不会在tempdb中持久存在,它会在SP或函数后立即自动清除。 Temp变量只能有1个索引,即primary,TT可以有更多的索引。对于少量数据使用临时变量,对TT使用反之亦然。变量中没有数据记录和数据回滚,但TT可用。使用变量比TT更少的SP重新编译。
全局临时表就像临时表一样,只要它们对所有会话都可见,因为创建会话有效。希望这可以让您了解您的方案可以采用哪种方式。
答案 1 :(得分:0)
表变量在功能上几乎与临时表相同 - 实际上,SQL服务器实际上至少在某些时候实际将temp变量实现为临时表。在你可以用它们做什么的限制方面存在一些功能上的差异,这使得在某些情况下比另一个更方便,插入exec的结果是常见的,因为使用create index来创建辅助键。
不保证temp var写入tempdb。事实上,Microsoft文档似乎暗示它不会写入tempdb,因此从理论上讲,temp vars可以预期更高性能或至少不会比临时表更慢。
全局临时表是可以在多个数据库连接上共享的临时表。与临时变量和临时表相比,这些相对较少。
ADDED
我们已在一些文章article#1,article#2,article#3和Stack Overflow
中详细讨论了这些差异ADDED
从这个答案的一些评论。我以前读过这些文章,是的,据我所知,表格vars总是通过tempdb实现。由于微软可能会在未来甚至2014年版本中更改实施(因为这些文章早于2014年)。这就是为什么我在理论上使用#34;等对冲词的原因。我引用的Stack Overflow文章简要提到了这一点。但附加文章的参考文献也相当不错。
我试图解释它们基本相同。您可以根据使用方式进行选择。如果任何一个都可以平等使用,你可能更喜欢临时变量,因为MS可以选择在未来提高效率。虽然看起来像是一个非常多的转储新手问题。
答案 2 :(得分:0)
临时表的作用域为会话
Create TABLE #person ----Statement 1
(
firstname varchar(100),
lastname varchar(100)
);
INSERT #person -----Statement 2
SELECT TOP(250) p.firstname, p.lastname
FROM person.person p;
SELECT count(*) FROM #person; -----Statement 3
无论每个语句是单独运行还是成批运行,#person都会被填充
而
表变量的作用域为批处理
DECLARE @person TABLE ----Statement 1
(
firstname varchar(100),
lastname varchar(100)
)
INSERT @person -----Statement 2
SELECT TOP(250) p.firstname, p.lastname
FROM person.person p
SELECT count(*) FROM @person ----Statement 3
除非所有三个语句都以批处理方式运行,否则返回错误消息
Must declare the table variable "@person".
示例:-如果在语句1或语句1或语句1和语句2后跟语句3的批处理中运行语句2,则会出现上述错误。