从临时表输出多个标识列

时间:2011-10-20 20:42:04

标签: sql sql-server-2008 identity-column temp-tables

我正在使用SQL Server 2K8并且有一个仅用于生成id的表,以便主键在多个表中是唯一的 - 多个表的唯一性是针对要求每个节点具有唯一性的元素层次结构树id无论类型如何。

它只有一个自动增量标识列,如果我要逐个插入记录,我通常会使用@@ IDENTITY来提取ID。但是,我正在尝试优化并批量执行插入操作,但首先需要从此表生成一批ID。

CREATE TABLE [dbo].[MyTreeElementIDGenTab](
        [MyTreeElementID] [int] IDENTITY(1,1) NOT NULL
)   

另外我知道我可以使用while循环/游标,但是想知道是否给出了行数据的临时表,如果我可以使用sql批处理语句来获取此表中的ID以在临时表中设置进入实际表格。

我以为我可以使用ROW_NUMBER()来生成索引并将相应的索引放在初始表中,但没有取得任何进展。任何帮助表示赞赏!

DECLARE @NodeTypeATab TABLE
(
    NodeTypeATabId INT NULL,        -- To be populated by dbo.MyTreeElementIDGenTab
    Name NVARCHAR(MAX),
    ItemIndex INT NOT NULL      -- I can initially populate this from the client starting 
                            -- with Index # 1 for joining but maybe I don't need it?
)

-- Populate @NodeTypeATab with test data here

DECLARE @EntityIdTab TABLE
(   
    ElementId INT NOT NULL,
    ItemIndex INT NOT NULL
)

-- This below doesn't compile to generate a new ElementId to later be set in NodeTypeATabId above
-- I want to output the generated ID into the temp table but also have a "correlation/index ID" to set
-- back in the original table or some way if not via a correlation/index ID 

INSERT INTO dbo.MyTreeElementIDGenTab DEFAULT VALUES
OUTPUT INSERTED.MyTreeElementID, ROW_NUMBER() OVER(ORDER BY MyTreeElementID ASC) INTO @EntityIdTab
FROM @NodeTypeATab

2 个答案:

答案 0 :(得分:1)

不确定我是否了解您要将生成的ID放在何处,但您可以使用合并和numbers table一次生成多个ID。下面是一些使用master..spt_values生成10个id的示例代码。

merge into MyTreeElementIDGenTab as T
using (select Number
       from master..spt_values
       where Number between 1 and 10 and
             [Type] = 'P') as S(I) 
on 0=1
when not matched then
  insert default values
output inserted.MyTreeElementID;  

答案 1 :(得分:1)

听起来你正在尝试模拟SQL Server Denali中可用的'Sequence'结构,有许多用于SQL Server的Sequence解决方案 - 但你需要知道要搜索的术语得到结果。

例如,以下是与CAT序列(提供您尝试做的事情)迁移到SQL Server中的SQL CAT文章。

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

另一种考虑方法是使用GUID来获取唯一ID - 这是在整个系统中获取行的唯一ID的非常标准的路径。