Sql 插入临时表并创建标识字段,而不首先声明临时表?

Sql 插入临时表并创建标识字段,而不首先声明临时表?,sql,sql-server,Sql,Sql Server,我需要在临时表中选择一组数据,然后进行一些辅助计算;为了帮助它更高效地工作,我希望在该表上有一个IDENTITY列。我知道我可以先用一个标识声明表,然后将其余的数据插入其中,但是有没有一种方法可以在第一步中完成呢?IIRC,insert-into命令使用源表的模式来创建临时表。这就是为什么不能尝试创建包含附加列的表的部分原因。标识列在内部绑定到一个名为生成器的SQL Server构造。噢,ye of little faith: SELECT *, IDENTITY( int ) AS idcol

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

IIRC,insert-into命令使用源表的模式来创建临时表。这就是为什么不能尝试创建包含附加列的表的部分原因。标识列在内部绑定到一个名为生成器的SQL Server构造。

噢,ye of little faith:

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

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

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

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)
这不会将变量作为列名


相信我,您最好执行:CREATE myTable TABLE或DECLARE TABLE@myTable,这允许您直接设置标识和主键。

您评论道:如果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确实有标识列

如果不需要标识列,请在创建新表时尝试以下操作:

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

好问题&马特的回答很好。如果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,
)

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

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

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

select IDENTITY( int ) as TempID, *, SectionID as Fix2IDs
into #TempSections
from Files_Sections

标识列使多个用户的情况保持一致。主键使事情变得高效。两种方法都可以达到最好的效果。当然,你不能同时使用两种方法。只是不要选择ident col作为queryNeed的一部分,如果使用ORDERBY子句并希望idcol的顺序相同,请小心。选择cast CurrentID as int as CurrentID,如果oldtable有一个标识列,那么您应该这样做;由于B+树维护,插入索引表的速度比未索引表慢,很少有例外;此应用程序可能没有足够的数据加载到临时表中,因此索引不值得。完全取决于情况,我们没有足够的信息知道他想要一个身份来提高效率。我们可以得出结论,他希望通过一个不存在的id访问这些项目。根据一个不存在的id进行排序很容易。他没有定义高效-我的想法是他想要一个身份不是为了速度,而是为了易于使用。但如果这是一个性能问题,只需索引现有列中的一个即可