在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