SQL SERVER 2005:在After Insert触发器中使用INSERT后,影响SCOPE_IDENTITY 问题

来源:互联网 发布:魔兽争霸mac版cd key 编辑:程序博客网 时间:2024/06/06 18:11

SQL SERVER 2005:在After Insert触发器中使用INSERT后,影响SCOPE_IDENTITY 问题

 

  一、一点概念

  当插入一条记录后,我们通常使用@@IDENTITY 等函数获取该表的自增量值。

  在SQL SERVER中,给出了三个获取自增量值的函数:

IDENT_CURRENT  返回为某个会话和用域中的指定表生成的最新标识值。 @@IDENTITY  返回为跨所有作用域的当前会话中的某个表生成的最新标识值。 SCOPE_IDENTITY  返回为当前会话和当前作用域中的某个表生成的最新标识值。 

  在上述三种方法中,只有IDENT_CURRENT  需要指定表:

IDENT_CURRENT( 'table_name' )

  然而在实际使用中,我们通常喜欢使用SCOPE_IDENTITY  来获取自增量值。

  二、问题的产生

  在数据库的操作中,为了完成数据关连关系,通常使用触发器来完成。

  例如,我们在一个表(Tab1)中定义了一个触发器,当向该表(Tab1)插入一条记录后,我们希望根据插入的条件,向另一张表(Tab2)插入与该表相关的数据。

   下面是一个简单的示例:

CREATE TRIGGER [dbo].[Test]
  ON  [dbo].[Tab1]
  AFTER INSERT
AS
BEGIN  
    INSERT INTO TAB2(
        /*...相关列名...*/
    ) SELECT /*...相关列名...*/ FROM inserted
    WHERE /*...相关条件...*/

 上面是一个简单的触发器。

  我们使用下列方法,向TAB1插入一行,并获取该表的自增量值:

INSERT INTO Tab1(
        /*...相关列名...*/
) VALUE(
        /*...相关值...*/
);

SELECT SCOPE_IDENTITY  

如果加入了上述的触发器,我们将无法获得Tab1的正确的自增量值。因为该自增量的值,在触发器中,被改变成了Tab2的自增量值。

 正确的方法应该是(注意兰色部分):

INSERT INTO Tab1(
        /*...相关列名...*/
) VALUE(
        /*...相关值...*/
);

SELECT IDENT_CURRENT('Tab1')

 

原创粉丝点击