在MS-SQL中,如何在不首先声明临时表的情况下插入临时表并创建IDENTITY字段?

时间:2008-09-23 20:13:38

标签: sql sql-server

我需要在临时表中选择一堆数据然后进行一些二次计算;为了使其更有效地工作,我希望在该表上有一个IDENTITY列。我知道我可以先用一个标识声明表,然后将其余的数据插入其中,但有没有办法在一步中完成它?

8 个答案:

答案 0 :(得分:74)

哦,你们有点小信心:

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

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

答案 1 :(得分:5)

您注释:如果oldtable具有标识列,则无法正常工作。

我认为这是你的答案。 #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 :(得分:2)

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

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

答案 3 :(得分:1)

为了提高效率,您需要声明其中一列是主键:

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

不会为列名采用变量。

相信我,你做得更好:创建#myTable TABLE(或者可能是DECLARE TABLE @myTable),它允许你直接设置IDENTITY和PRIMARY KEY。

答案 4 :(得分:1)

好问题&马特是一个很好的答案。要在oldtable具有标识的情况下稍微扩展语法,用户可以运行以下命令:

SELECT col1, col2, IDENTITY( int ) AS idcol

  INTO #newtable

  FROM oldtable

-

如果oldtable的脚本是这样的话,那将是这样的:

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

这个问题对我有用的信息,

卡托

答案 5 :(得分:0)

如果在*之后,你将第二次破坏查询的idcolumn别名...并给它一个新名称......它神奇地开始工作。

选择IDENTITY(int)AS TempID,*,SectionID作为Fix2IDs 到#TempSections 来自Files_Sections

答案 6 :(得分:-3)

您可以执行Select Into,它会根据您选择的字段动态创建表结构,但我认为它不会为您创建标识字段。

答案 7 :(得分:-4)

IIRC,INSERT INTO命令使用源表的模式来创建临时表。这就是为什么你不能尝试创建一个带有附加列的表的部分原因。标识列内部绑定到称为生成器的SQL Server构造。