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 列值