临时表:CREATE 与 SELECT INTO

dii*_*___ 3 t-sql sql-server temp-tables sql-server-2014

我搜索并找到了这篇关于 SQL Server 中临时表的文章,因为我在我们的一个存储过程中遇到了一行说:

SELECT Value SomeId INTO #SomeTable FROM [dbo].[SplitIds](@SomeIds, ';')
Run Code Online (Sandbox Code Playgroud)

我知道它#SomeTabletempdb作为临时表存储的。但是,我不明白为什么我们不必先使用,CREATE TABLE #SomeTable因为它是在提到的文章中写的。我们的代码运行良好,我只是不明白为什么使用SELECT ... INTO #SomeTable. CREATE TABLE #SomeTable一开始加的话会有什么后果?我们会得到性能上的任何差异吗?该表会存储在另一个位置吗?

Chr*_*own 5

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

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

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

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

作为 限制的示例,Select ... into [table]下面的脚本创建了一个包含两个字段的临时表,First_Name以及Last_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;
Run Code Online (Sandbox Code Playgroud)

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

Create Table #tempTable (
    First_Name varchar(3) Not Null
    Last_Name varchar(5) Not Null
);
Run Code Online (Sandbox Code Playgroud)