select scope_identity()
select scope_identity()是一个定义数值并返回一个插入识别资料行的值的功能函式。
传回插入相同範围之识别资料行中的最后一个识别值。範围是一个模组:预存程式、触发程式、函式或批次。因此,如果两个陈述式在相同预存程式、函式或批次中,它们就在相同範围中。
语法:
SCOPE_IDENTITY()
传回类型:
numeric
备注:
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是类似的函式,因为它们会传回插入识别资料行的值。
IDENT_CURRENT 不受範围和工作阶段的限制;它只限于指定的资料表。IDENT_CURRENT 会传回在任何工作阶段和任何範围中,产生给特定资料表的值。如需详细资讯,请参阅<IDENT_CURRENT (Transact-SQL)>。
SCOPE_IDENTITY 和 @@IDENTITY 会传回目前工作阶段任何资料表中所产生的最后一个识别值。不过,SCOPE_IDENTITY 会传回只在目前範围内插入的值;@@IDENTITY 不限于特定範围。
例如,有 T1 和 T2 两份资料表,T1 定义了 INSERT 触发程式。当资料列插入 T1 时,会引发触发程式,且会在 T2 中插入一个资料列。这个状况说明两个範围:在 T1 插入,以及触发程式在 T2 插入。
假设 T1 和 T2 都有识别资料行,在 T1 的 INSERT 陈述式结束时,@@IDENTITY 和 SCOPE_IDENTITY 会传回不同的值。@@IDENTITY 会传回在目前工作阶段中,跨越任何範围所插入的最后一个识别资料行值。这是在 T2 中插入的值。SCOPE_IDENTITY() 会传回在 T1 中插入的 IDENTITY 值。这是相同範围内所发生的最后一项插入。如果在範围内的识别资料行执行任何 INSERT 陈述式之前叫用 SCOPE_IDENTITY() 函式,这个函式会传回 Null 值。
失败的陈述式和交易可能会变更资料表的目前识别,以及建立识别资料行值中的间距。识别值永远不会回复,即使试图将值插入资料表的交易未获认可,也是如此。例如,如果 INSERT 陈述式因 IGNORE_DUP_KEY 违规而失败,资料表的目前识别值仍会递增。
範例:
A. 使用 @@IDENTITY 和 SCOPE_IDENTITY 搭配触发程式
下列範例会建立 TZ 和 TY 这两份资料表,以及 TZ 的 INSERT 触发程式。当资料列插入 TZ 资料表时,会引发触发程式 (Ztrig),且会在 TY 中插入一个资料列。
USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL)
INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
转载请注明出处海之美文 » select scope_identity()