在MS-SQL中,如何在不首先声明临时表的情况下将INSERT INTO临时表并创build一个IDENTITY字段?

我需要select一堆数据到临时表中,然后进行一些二次计算; 为了使其更有效地工作,我希望在该表上有一个IDENTITY列。 我知道我可以用一个身份首先声明表,然后插入其余的数据,但有一种方法可以在1步?

噢,你们小信仰:

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

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

您评论说:如果oldtable具有标识列,则不起作用。

我想这是你的答案。 #newtable自动从旧表中获取标识列。 运行下面的语句:

 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确实有标识列。

如果您不想使用标识列,请在创build#newtable时尝试以下操作:

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

如果你想包含当前标识的列,你仍然可以这样做,但是你必须明确地列出列并且把当前的标识转换为一个int(假设它是一个),如下所示:

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

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

 ALTER TABLE #mytable ADD PRIMARY KEY(KeyColumn) 

这不会为列名采取variables。

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

好问题和马特是一个很好的答案。 如果oldtable具有标识,则可以稍微扩展语法,用户可以运行以下命令:

 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这个问题的信息帮助我,

卡托

如果在*之后,你别名了第二次打破查询的id列,并给它一个新的名字…它神奇地开始工作。

selectIDENTITY(int)AS TempID,*,SectionID作为Fix2IDs到Files_Sections的#TempSections

你可以做一个Select Into,它将根据你select的字段来实时创build表结构,但是我不认为它会为你创build一个标识字段。

IIRC,INSERT INTO命令使用源表的模式来创build临时表。 这是你不能试着创build一个额外的列表的原因的一部分。 标识列在内部绑定到称为生成器的SQL Server结构。