【问题标题】:Temp tables: CREATE vs. SELECT INTO临时表:CREATE 与 SELECT INTO
【发布时间】:2016-09-13 09:43:58
【问题描述】:

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

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

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

【问题讨论】:

  • 因为该语法明确用于在理智的时候创建和填充。您可以选择先创建范围,但随后您的插入语句需要更改为insert into #temp select....。基本上答案是;因为 SELECT INTO 创建临时表,而 INSERT INTO 不会。 (P.S. 如果你先创建表,你有更多的控制权;指定主键等,但是你不能使用 SELECT INTO,你必须更改为 INSERT INTO。)
  • @MatBailie 这就是我想要的。请将其发布为答案,以便可以关闭问题。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多