临时表:CREATE 和 SELECT INTO 的区别

6

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

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

我知道#SomeTable 存储在临时表tempdb中。然而,我不明白为什么我们不必像文章中所写的那样先使用 CREATE TABLE #SomeTable来创建这个表。我们的代码可以正常运行,只是我不明白为什么仅使用SELECT ... INTO #SomeTable就足够了。如果我在开头加上CREATE TABLE #SomeTable,会产生什么后果?会影响性能吗?表会存储在其他地方吗?

3
因为该语法明确用于同时创建和填充表。你可以选择先创建范围,但是此时插入语句需要更改为insert into #temp select....。本质上的答案是:因为SELECT INTO创建临时表,而INSERT INTO则不会。(附注:如果您首先创建表,则拥有更多的控制权;例如指定主键等,但是您不能使用SELECT INTO,必须更改为INSERT INTO。) - MatBailie
@MatBailie 这就是我想要的。请把它发布为答案,以便关闭问题。 - diiN__________
1个回答

8

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
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接