1

我正在使用 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
4

2 回答 2

1

不确定我是否了解您想将生成的 id 放在哪里,但您可以使用合并和数字表一次生成多个 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;  
于 2011-10-20T21:18:50.617 回答
1

听起来您正在尝试模拟 SQL Server Denali 中将提供的“序列”构造,周围发布了许多用于 SQL Server 的序列解决方案 - 但您需要知道要搜索的术语才能获得结果。

例如,以下是关于将 Oracle 序列(提供您正在尝试执行的操作)迁移到 SQL Server 的 SQL CAT 文章。

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

要考虑的替代方法是使用 GUID 获取唯一 ID - 这是在整个系统中获取行的唯一 ID 的非常标准的途径。

于 2011-10-20T21:22:18.440 回答