2

我在表中使用标识列作为主键。

在某些情况下,我需要在插入新行之前使用主键。

例如,在 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
4

2 回答 2

1

你可以在表上加一个排他锁,得到最大的ID,加1。那将是你的下一个身份证。插入您的数据,解锁表。

然而,

我无法理解为什么您要在创建值之前使用它。你能发布更多关于这方面的信息吗?

于 2011-09-28T04:43:55.660 回答
0

如果您需要一个跨数据库和数据库服务器唯一的密钥,那么 GUID(全局唯一标识符)肯定可以满足这一需求。如果您想生成一个新的 GUID 服务器,您可以简单地使用该NEWID()功能

SELECT NEWID()
于 2011-09-28T05:31:38.587 回答