插入临时表,并创建一个IDENTITY字段,而无需先声明临时表?

问题描述 投票:40回答:8

我需要在临时表中选择一堆数据,然后进行一些辅助计算;为了帮助使其更有效地工作,我希望在该表上有一个IDENTITY列。我知道我可以先用一个身份声明表,然后将其余数据插入表中,但是有一种方法可以一步完成吗?

sql sql-server
8个回答
77
投票

哦,一点信心都没有:

SELECT *, IDENTITY( int ) AS idcol
  INTO #newtable
  FROM oldtable

http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx


5
投票

您评论:如果oldtable有一个Identity列,则不起作用。

我认为这就是您的答案。 #newtable自动从oldtable中获取一个标识列。运行以下语句:

create table oldtable (id int not null identity(1,1), v varchar(10) )

select * into #newtable from oldtable

use tempdb
GO
sp_help #newtable

它显示#newtable确实具有标识列。

如果您不希望使用身份列,请在创建#newtable时尝试此操作:

select id + 1 - 1 as nid, v, IDENTITY( int ) as id into #newtable
     from oldtable

2
投票

如果要包括当前标识的列,您仍然可以这样做,但是您必须显式列出这些列并将当前标识转换为一个int(假设现在是一个整数),如下所示:

select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID 
into #temp
from myserver.dbo.mytable

1
投票

为了使事情高效,您需要声明其中一列是主键:

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

不会为列名使用变量。

相信我,您最好做一个:CREATE #myTable TABLE(或者可能是DECLARE TABLE @myTable),它允许您直接设置IDENTITY和PRIMARY KEY。


1
投票

[Good Question&Matt's是个好答案。如果旧表具有标识,则可以稍微扩展一下语法,用户可以运行以下命令:

SELECT col1, col2, IDENTITY( int ) AS idcol

  INTO #newtable

  FROM oldtable

-

如果旧表被编写成这样的脚本:

CREATE TABLE [dbo].[oldtable]
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [col1] [nvarchar](50) NULL,
    [col2] [numeric](18, 0) NULL,
)

Thx 4这个问题对我有帮助的信息,

Catto


0
投票

如果在*之后,您为第二次中断查询的id列加上别名...并给它起一个新名称...它神奇地开始工作。

选择IDENTITY(int)AS TempID,*,SectionID作为Fix2IDs进入#TempSections从Files_Sections


-3
投票

您可以执行Select Into,这将基于您选择的字段即时创建表结构,但我认为它不会为您创建一个身份字段。


-4
投票

IIRC,INSERT INTO命令使用源表的架构来创建临时表。这就是您不能只尝试创建带有附加列的表的部分原因。标识列在内部与称为生成器的SQL Server构造相关。

© www.soinside.com 2019 - 2024. All rights reserved.