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

时间:2020-03-06 14:37:27  来源:igfitidea点击:

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

解决方案

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

哦,一点信心都没有:

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

http://msdn.microsoft.com/zh-CN/library/aa933208(SQL.80).aspx

我们可以执行"选择进入",这将根据我们选择的字段即时创建表结构,但是我认为它不会为我们创建一个标识字段。

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

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

这样就不会为列名使用变量。

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

我们评论了:如果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

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

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

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

卡托

如果要包括当前标识的列,仍然可以执行此操作,但是必须显式列出这些列并将当前标识转换为int(假设现在为一),如下所示:

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