sql server 2000 @@identity、Scope_identity()、ident_current的区别

     今天遇到一个问题,最后发现是对@@identity、Scope_identity()、ident_current了解不够造成的,写下来给像我一样的新手提示一下

     最初有两个表table1、table2,存储过程pro1实现这样的逻辑,向table1插入一行数据之后,用@@identtity取得identity列刚插入的值,插入table2,一直运行正常。

     后来由于业务变化,增加了table3、table4,于是想当然的在table1定义了一个insert触发器,当table1插入一行时,激发触发器在table3插入一行,同时用scope_identity()取得table3刚插入的identity列的值,然后把该identtity列的值插入table4;

     然后问题出现了,每次执行存储过程pro1之后,table1、table3、table4里插入的数据都正常,但是插入table2的数据却不是table1的identity列的值,而是table3的identity列的值

     最后查资料发现问题在于@@identity、Scope_identity()是有区别的(没区别就没有必要弄两个了,当初真是晕呀,呵呵);两者都是用来返回identity值得

     scope_identity()

          返回当前会话同一作用域中的任意表生成的最后一个identity值

     @@identity

          返回当前会话插入到任意表生成的最后一个identity值(不受作用域限制)

     ident_current

          返回任意会话和作用域中的特定表所生成的最后一个identity值(不受会话和作用域限制,但是限制于特定表)

 

     作用域:一个模块就是一个作用域;一个存储过程、一个触发器、一个批处理或者一个函数都是一个独立的作用域。

你可能感兴趣的:(SQL Server 2000)