在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结构。