临时表:CREATE vs. SELECT INTO

时间:2016-09-13 09:43:59

标签: sql-server tsql sql-server-2014 temp-tables

我搜索过并发现this article有关SQL Server中的临时表的原因,因为我在其中一个存储过程中遇到了一行说:

SELECT Value SomeId INTO #SomeTable FROM [dbo].[SplitIds](@SomeIds, ';')

我知道#SomeTable作为临时表存储在tempdb中。但是,我不明白为什么我们不必首先使用CREATE TABLE #SomeTable,因为它是在上述文章中写的。我们的代码工作正常,我只是不明白为什么它足以使用SELECT ... INTO #SomeTable。当我在开头添加CREATE TABLE #SomeTable时会有什么后果?我们会在性能方面有任何差异吗?表格会存放在其他地方吗?

1 个答案:

答案 0 :(得分:4)

Select ... into [table]使用从Select语句生成的数据集的属性来创建临时表,然后填充表格。

使用Select ... into [table]的替代方法是使用Create Table语句,后跟Insert Into语句。明确地创建表格可以提供更多的控制和精确度。

使用Select ... into [Table]可能看起来很简单,但有些情况Select ... into [Table]会出现问题。

例如,当您打算创建临时表并在以后插入其他行时,使用Select ... into [Table]语法可能会导致问题,尤其是对于基于字符串和可以为空的字段。

作为Select ... into [table]限制的示例,下面的脚本会创建一个包含两个字段First_NameLast_Name的临时表。接下来,Insert语句尝试将另一条记录添加到临时表中,但由于值将被截断而失败。

Select 'Bob' as First_Name
    , 'Smith' as Last_Name
Into #tempTable;

Insert into #tempTable (First_Name, Last_Name)
Select 'Christopher' as First_Name
    , 'Brown' as Last_Name;

脚本失败,因为Select ... into [table]语句创建了一个与以下脚本等效的表:

Create Table #tempTable (
    First_Name varchar(3) Not Null
    Last_Name varchar(5) Not Null
);