SCOPE_IDENTITY、IDENT_CURRENT 、@@IDENTITY

测试表的Dragon_Cate设计如图:

 

其中CateID是一个自增量为1的主键。

 

相应的添加记录的存储过程为:

CREATE PROCEDURE [dbo].[Dragon_Cate_Add]

(

    @CateName nvarchar(20),

    @CateIntro nvarchar(50),

    @Depth int,

    @SortOrder int,

    @Path varchar(50),

    @Visible bit

)

AS

BEGIN

    INSERT INTO [Dragon_Cate]

(

    [CateName],

    [CateIntro],

    [Depth],

    [SortOrder],

    [Path],

    [Visible]

)

VALUES

(

    @CateName,

    @CateIntro,

    @Depth,

    @SortOrder,

    @Path,

    @Visible

)

    --分别以以下三种类型做测试

    --SELECT Ident_current('Dragon_Cate')

    --SELECT @@IDENTITY

--SELECT SCOPE_IDENTITY()

END

测试结果表明,如果表’Dragon_Cate’没有触发器或其他扩展时候(单单在‘Dragon_Cate’这个作用域中),三种类型返回的值都是一样的。

 

现在扩大一下作用域, ’Dragon_Cate’增加触发器如下:

CREATE TRIGGER testTrigger

   ON Dragon_Cate

   AFTER INSERT

AS

BEGIN

    SET NOCOUNT ON 

    Insert into Dragon_Notice(NoticeContent,PubDate,Visible,Latest,SortOrder)

    values('abc',getDate(),1,1,1)

END

这个触发器在为’Dragon_Cate’表增加一条记录后触发,为表’Dragon_Notice’增加一条记录,这里的表’Dragon_Notice’’Dragon_Cate’的设计是一样的,也有一个自增类型的主键.

 

测试结果表明

SELECT Ident_current('Dragon_Cate')SELECT @@IDENTITY返回的是最后触发器里’Dragon_Notice’表返回的自增变量,

而SELECT SCOPE_IDENTITY()返回的是’Dragon_Cate’的自增变量.

 

得出的结果:

SELECT Ident_current('Dragon_Cate')SELECT @@IDENTITY返回的应该是当前会话中任何作用域内的最后生成的 IDENTITY 列值,

SELECT SCOPE_IDENTITY()只能返回当前会话和当前作用域内的最后生成的IDENTITY 列值

 

posted @ 2010-05-11 13:16  ._  阅读(224)  评论(0编辑  收藏  举报