我正在使用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
答案 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的非常标准的路径。