【发布时间】:2011-11-26 13:26:43
【问题描述】:
我在表中使用标识列作为主键。
在某些情况下,我需要在插入新行之前使用主键。
例如,在 Oracle 中我使用:select <sequence_name>.nextval into <variable> from dual
而且我确信在我的 sp 执行时没有人会插入任何具有相同 ID 的行。
对于 SQL Server,我可以读取当前的标识值并且它是递增的,但是如果不插入一行就无法递增它。
更新:问题是 - 在插入一行之前,我如何才能完成在 SQL Server 中使用 ID(作为标识列)的任务,并确保它在我的存储过程结束时是唯一的。
更新:我有一个带有 HierarchyId 列的表。在我的例子中,形成第一级层次结构的方法是根据 indentity 列插入 hierarchyId 列。我现在就是这样做的:
begin transaction
insert into [dbo].[Group](GroupTypeId,CompanyOwnerId,GroupHierarchyId)
values(@GroupTypeId,@HeaderCompanyId,null)
update [dbo].[Group]
set GroupHierarcyId=hierarchyid::GetRoot().GetDescendant(cast ('/'+cast(@NewGroupId as varchar)+'/' as hierarchyid),null)
where GroupId=scope_identity()
commit
【问题讨论】:
-
那么,您想首先插入主键列,然后将所有剩余列值设置为“Null”,对吗?
-
SQL Server 的下一个版本将引入
sequence,我想这符合您的要求。这是 Aaron Bertrand 的一篇博客文章,介绍了该技术以及今天可以使用的其他技术。 sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/… -
简而言之:你不能 - 句号。
IDENTITY列值仅在插入行后建立 - 这就是它的工作方式,也是你应该使用它的方式。有关 SQL Server“Denali”将带来的新功能(即 SEQUENCE 作为成熟的 DB 对象),请参阅上面的评论
标签: sql-server-2008 identity-column