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