Sql-server:触发器和最后插入的ID

时间:2015-05-06 07:31:33

标签: php sql-server triggers propel

我有一个使用sql-server数据库和触发器的PHP应用程序。工作流程如下:
- 我在DB中创建了一个对象,
- 触发器通过在其中插入行来将创建记录到专用表中 - 然后从PHP我得到最后一个插入的ID。

问题是最后插入的ID与日志行有关,而与我的对象无关。

从PHP代码中,我不能以另一种方式做,因为这是由我的ORM(Propel)完成的。所以我必须让它在数据库方面工作。有没有办法实现它,例如通过告诉触发器不被视为"最后插入的id' ?

3 个答案:

答案 0 :(得分:1)

您需要在存储过程中使用 SELECT SCOPE_IDENTITY() 来获取在当前会话范围内创建的最后一个ID。

如果您使用其他选项,它将返回Log表的ID。

答案 1 :(得分:0)

您需要使用Scope_Identity()。这将获取当前会话范围内生成的最后一个ID(触发器在自己的范围内运行)。

答案 2 :(得分:0)

您有以下几种选择:@@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT

  1. SELECT @@IDENTITY

    它返回连接上生成的最后IDENTITY值,无论生成该值的表如何,也不管生成该值的语句的范围如何。

  2. SELECT SCOPE_IDENTITY()

    它返回连接上生成的最后IDENTITY值以及同一范围内的语句,而不管生成该值的表。

  3. SELECT IDENT_CURRENT(‘tablename’)

    它返回表中生成的最后IDENTITY值,无论创建该值的连接如何,也不管生成该值的语句的范围如何。

    IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表格。 IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的标识值。

  4. http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/