我搜索过并发现this article有关SQL Server中的临时表的原因,因为我在其中一个存储过程中遇到了一行说:
SELECT Value SomeId INTO #SomeTable FROM [dbo].[SplitIds](@SomeIds, ';')
我知道#SomeTable
作为临时表存储在tempdb
中。但是,我不明白为什么我们不必首先使用CREATE TABLE #SomeTable
,因为它是在上述文章中写的。我们的代码工作正常,我只是不明白为什么它足以使用SELECT ... INTO #SomeTable
。当我在开头添加CREATE TABLE #SomeTable
时会有什么后果?我们会在性能方面有任何差异吗?表格会存放在其他地方吗?
答案 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_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;
脚本失败,因为Select ... into [table]
语句创建了一个与以下脚本等效的表:
Create Table #tempTable (
First_Name varchar(3) Not Null
Last_Name varchar(5) Not Null
);