2013-07-20 39 views
1

使用SQL,当从SP向表中插入值时,是否可以在将值添加到表之前获取主键的值?从SP获取主键

+0

“将值添加到表之前”?不,因为有人可能会在你面前插入东西。你想解决什么问题? – spender

+1

@spender - 你似乎在假设'IDENTITY',它肯定可以用外部生成的PK值,例如序列或guid。 –

+2

*** SQL ***只是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品...许多东西都是特定于供应商的 - 所以我们真的需要知道什么**数据库系统**(以及您使用的版本)(请相应地更新标签)。 –

回答

0

利用关系数据库的力量,这当然是可能的。假设像马丁史密斯说的那样,你使用自动生成的密钥,那么你可以使用一个事务来做你正在寻找的东西。

这里的总体思路:

  1. 开始事务。
  2. 做插入。
  3. 使用主键执行任何您需要执行的操作,包括更新插入的行以反映值。
  4. 提交或回滚

通过您的插入之前开始交易,你可以保证,没有人会能够看到新的行,直到您提交事务。如果密钥不符合您的喜好,您可以回滚事务,而其他人不会知道。如果密钥足够,可以在提交之前修改刚刚插入的行。

由于您拥有一个事务,所以在您提交之前,没有其他人可以看到您插入的中间数据。因此,您可以在实际插入之前更新刚刚插入的行,就好像您拥有主键一样。

0

如果您使用的是SQL Server,最好的方法是使用MERGE或INSERT命令使用OUTPUT子句来取回密钥。即使这不在插入之前,您可以使用OUTPUT的结果来加回数据的结果以插入后续的子记录。

另外,如果您使用SQL Server,则可以查看IDENT_CURRENT函数,该函数将返回表的当前标识值。如果你正在以基于集合的方式编写你的SQL,我上面提到的OUTPUT对我来说最适合我。