“选择临时表”是什么意思?

时间:2010-04-16 03:57:33

标签: sql temp-tables

This answer让我有些困惑。什么是“选择临时表”,有人能给我看一个简单的例子吗?

5 个答案:

答案 0 :(得分:2)

临时表是仅存储过程持续时间的表,通常用于在最终计算的过程中保存临时结果。

在SQL Server中,所有临时表都以#为前缀,因此如果您发出类似

的语句
Create table #tmp(id int, columnA)

然后SQL Server将自动知道该表是临时的,并且当存储过程超出范围时它将被销毁,除非明确删除该表,如

drop table #tmp

我经常在存储过程中使用它们,这些存储过程针对具有高事务量的大型表运行,因为我可以将我需要的数据子集作为临时副本插入到临时表中并处理数据而不用担心会导致数据丢失一个生产系统,如果我正在对数据做的是一个相当激烈的操作。

在SQL Server中,所有临时表都存在于tempdb数据中。

有关详细信息,请参阅this article

答案 1 :(得分:2)

如果您想要一次又一次地使用一组复杂的结果,那么您是否继续查询主表(数据将会发生变化,并可能影响性能),还是将它们存储在临时表中?进行更多处理。最好经常使用临时表。

或者你真的需要以非设定的方式遍历行,你可以使用临时表(或CURSOR)

如果对数据库执行简单的CRUD,那么您可能不需要临时表

你有:

  • 表变量:DECLARE @foo TABLE (bar int...)
  • 明确临时表:CREATE TABLE #foo (bar int...)
  • 内联创建:SELECT ... INTO #foo FROM...

答案 2 :(得分:1)

您可以使用SELECT ... INTO创建临时表并将其填充如下:

SELECT Col1, Col2... 
INTO #Table
FROM ...
WHERE ...

(顺便说一句,这种语法适用于SQL Server和Sybase。)

编辑一旦您像上面那样创建了表格,就可以在同一个连接上使用其他查询:

Select
From OtherTable
    Join #Table
        On #Table.Col = OtherTable.Col

这里的关键是它都发生在同一个连接上。因此,从客户端脚本创建和使用临时表会很尴尬,因为您必须确保表的所有后续使用都在同一个连接上。相反,大多数人在存储过程中使用临时表,他们在一行上创建表,然后在同一过程中使用几行。

答案 3 :(得分:1)

将临时表视为'table'类型的sql变量。在脚本和存储过程中使用它们。当您需要操作非简单值但是数据库表的子集(垂直和水平)的数据时,它会派上用场。

当您意识到这些优势时,您可以利用临时表的各种共享模型(范围)带来的更多功能:私有,全局,事务等。所有主要的RDBMS引擎都支持临时表,但没有标准功能或者他们的语法。

有关用法的示例,请参阅answer

答案 4 :(得分:1)

临时表是使用某种语法动态创建的表:

SELECT [columns] INTO #MyTable FROM SomeExistingTable

您拥有的是一个填充了您选择的值的表。现在你可以选择它,更新它,无论如何。

SELECT FirstName FROM #MyTable WHERE...

该表在某个预定的时间范围内存在,例如,在其存在的存储过程的持续时间内。然后它从内存中消失,再也无法访问。暂时的。

HTH