临时表:CREATE 与 SELECT INTO

Temp tables: CREATE vs. SELECT INTO

我在 SQL 服务器中搜索并找到了 this article 关于临时 table 的信息,因为我在我们的一个存储过程中遇到了一行:

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

我知道 #SomeTable 作为临时 table 存储在 tempdb 中。但是,我不明白为什么我们不必先使用 CREATE TABLE #SomeTable ,因为它是在提到的文章中写的。我们的代码运行良好,我只是不明白为什么使用 SELECT ... INTO #SomeTable 就足够了。如果我在开头添加 CREATE TABLE #SomeTable 会有什么后果?我们会在性能上有什么不同吗? table 会存储在另一个位置吗?

Select ... into [table] 使用从 Select 语句生成的数据集的属性创建临时 table 并随后填充 table.

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

使用 Select ... into [Table] 似乎很容易,但在某些情况下 Select ... into [Table] 可能会出现问题。

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

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

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] 语句创建了一个 table 等效于以下脚本:

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