【问题标题】:Primary key value after insertion of row in SQL Server 2005在 SQL Server 2005 中插入行后的主键值
【发布时间】:2011-10-11 14:24:32
【问题描述】:

在 SQL Server 2005 中,我使用存储过程将一行插入到表中,并且我想在插入该行后立即获取新的主键值。我正在使用以下方法在插入行后获取主键值

Create Proc Sp_Test
@testEmail varchar(20)=null,-- Should be Unique
@testName varchar(20)=null -- Should be Unique
as

begin

insert into tableTest  (testUserEmail,testUserName)values (@testValue,@testName)

select MAX(ID) from tableTest --ID is Primary Key 

--或

select ID from tableTest  where  testUserEmail =@testValue and testUserName = @testName

--或

select  SCOPE_IDENTITY() as ID

end

请建议我哪种方法更适合执行所描述的任务。

【问题讨论】:

    标签: sql-server-2005 stored-procedures primary-key insert-update


    【解决方案1】:

    如果你有一个身份列作为主键,你应该使用SCOPE_IDENTITY()

    您也可以使用 OUTPUT Clause 返回 ID。

    insert into tableTest(testUserEmail,testUserName) 
    output inserted.ID
    values (@testValue, @testName)
    

    【讨论】:

      【解决方案2】:

      无论如何 - 如果您的 ID 列是 INT IDENTITY,请使用 SCOPE_IDENTITY() - 会为您提供正确的结果!

      如果您有多个客户端几乎同时插入行,使用MAX(ID) 的第一种方法将非常失败 - 您将得到错误的结果。不要用那个!

      如果已经存在具有相同 E-Mail 和 name 值的另一个条目,则第三种方法可能会失败。

      另外,作为旁注:你应该永远使用sp_作为你的前缀!这是 Microsoft 保留的前缀,在性能方面有缺点 - 请使用其他前缀。

      【讨论】:

      • 感谢 marc_s 的回复...你告诉“如果您有多个客户端几乎同时插入行,使用 MAX(ID) 的第一种方法将非常失败 - 您将得到错误的结果. 不要使用那个!”......但我有一个问题,如果多个用户插入行而不是 sql 语句集将为每个客户端单独执行。直到过程结束块
      • @Shailesh Sahu:NO! 如果您没有任何显式事务(而您也没有),那么 INSERT 语句本身就是一个隐式事务.一旦运行,其他客户端就可以读取这些值 - 如果您有数百个客户端同时插入,您肯定会得到错误的结果......即使您有交易 - 其他人可能正在阅读 WITH (NOLOCK) 或其他机制和取回错误值....
      猜你喜欢
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多