SCOPE_IDENTITY(scope_identity 并发)

http://www.itjxue.com  2023-02-25 19:56  来源:未知  点击次数: 

scope_identity()这个函数是用做什么啊?

SCOPE_IDENTITY

返回插入到同一作用域中的

IDENTITY

列内的最后一个

IDENTITY

值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

语法

SCOPE_IDENTITY(

)

返回类型

sql_variant

注释

SCOPE_IDENTITY、IDENT_CURRENT

@@IDENTITY

在功能上相似,因为它们都返回插入到

IDENTITY

列中的值。

IDENT_CURRENT

不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT

返回为任何会话和作用域中的特定表所生成的值。有关更多信息,请参见

IDENT_CURRENT。

SCOPE_IDENTITY

@@IDENTITY

返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY

只返回插入到当前作用域中的值;@@IDENTITY

不受限于特定的作用域。

例如,有两个表

T1

T2,在

T1

上定义了一个

INSERT

触发器。当将某行插入

T1

时,触发器被激发,并在

T2

中插入一行。此例说明了两个作用域:一个是在

T1

上的插入,另一个是作为触发器的结果在

T2

上的插入。

假设

T1

T2

都有

IDENTITY

列,@@IDENTITY

SCOPE_IDENTITY

将在

T1

上的

INSERT

语句的最后返回不同的值。

@@IDENTITY

返回插入到当前会话中任何作用域内的最后一个

IDENTITY

列值,该值是插入

T2

中的值。

SCOPE_IDENTITY()

返回插入

T1

中的

IDENTITY

值,该值是发生在相同作用域中的最后一个

INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用

SCOPE_IDENTITY()

函数,则该函数将返回

NULL

值。

有关说明,请参见示例。

示例

下列示例将创建两个表

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')

INSERT

TZ

VALUES

('Carla')

SELECT

*

FROM

TZ

--Result

set:

This

is

how

table

TZ

looks

Z_id

Z_name

-------------

1

Lisa

2

Mike

3

Carla

CREATE

TABLE

TY

(

Y_id

int

IDENTITY(100,5)PRIMARY

KEY,

Y_name

varchar(20)

NULL)

INSERT

TY

(Y_name)

VALUES

('boathouse')

INSERT

TY

(Y_name)

VALUES

('rocks')

INSERT

TY

(Y_name)

VALUES

('elevator')

SELECT

*

FROM

TY

--Result

set:

This

is

how

TY

looks:

Y_id

Y_name

---------------

100

boathouse

105

rocks

110

elevator

/*Create

the

trigger

that

inserts

a

row

in

table

TY

when

a

row

is

inserted

in

table

TZ*/

CREATE

TRIGGER

Ztrig

ON

TZ

FOR

INSERT

AS

BEGIN

INSERT

TY

VALUES

('')

END

/*FIRE

the

trigger

and

find

out

what

identity

values

you

get

with

the

@@IDENTITY

and

SCOPE_IDENTITY

functions*/

INSERT

TZ

VALUES

('Rosalie')

SELECT

SCOPE_IDENTITY()

AS

[SCOPE_IDENTITY]

GO

SELECT

@@IDENTITY

AS

[@@IDENTITY]

GO

--Here

is

the

result

set.

SCOPE_IDENTITY

4

/*SCOPE_IDENTITY

returned

the

last

identity

value

in

the

same

scope,

which

was

the

insert

on

table

TZ*/

@@IDENTITY

115

/*@@IDENTITY

returned

the

last

identity

value

inserted

to

TY

by

the

trigger,

which

fired

due

to

an

earlier

insert

on

TZ*/

SCOPE_IDENTITY()

SCOPE_IDENTITY()取得返回在当前会话中的任何表内所生成的最后一个标识值

比如新增一条记录,获得插入记录的ID号

selectscope_identity报错

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 (

调用scope_identity返回值

有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。

如何获得sqlserver中行的唯一值

列设成整型,并自增

SqlServer中的自增的ID的最后的值:

SELECT

SCOPE_IDENTITY() --返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。SELECT

@@IDENTITY --返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值SELECT

IDENT_CURRENT('TbName')--不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT

返回为任何会话和作用域中的特定表所生成的值。

一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或

批处理中,则它们位于相同的作用域中。对于马上使用的刚才插入的新记录ID用SCOPE_IDENTITY()是最合适的;对于想要得到一系列的操作中最

后得到的那个自增的ID最好用@@IDENTITY;对于想要得到一个表中的最后一个插入操作所产生的ID的最好用

IDENT_CURRENT('TBName') DECLARE @TMP_ID INT SET @TMP_ID =

IDENT_CURRENT('BID_EvaluateItem') IF ((@TMP_ID IS NOT NULL)

AND (@TMP_ID 0)) BEGIN --其它的操作

设成GUID类型 select newid() 可保证全球唯一

(责任编辑:IT教学网)

更多

相关windows文章