`

在SQL Server 中如何得到刚刚插入的标识值

阅读更多

数据库实际应用中,我们往往需要得到刚刚插入的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?

有时我们会使用

SELECT @@Identity

来获得我们刚刚插入的值,比如下面的代码

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码一:
use
tempdb
if exists ( select * from sys.objects where object_id = object_id (N ' [test1] ' ) and type in (N ' u ' ))
drop table [ test1 ]
go
create table test1
(
id
int identity ( 1 , 1 ),
content
nvarchar ( 100 )
)
insert into test1(content)
values ( ' solorez ' )
select @@identity

乐观情况下,这样做是没问题的,但如果我们如果先运行下面的代码二创建一个触发器、再运行代码三:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码二:
create
table test2
(
id
int identity ( 100 , 1 ),
content
nvarchar ( 100 )
)

create trigger tri_test1_identitytest_I
on test1after insert
as
begin
insert into test2
select content from inserted
end
代码三:
insert
into test1(content)
values ( ' solorez2 ' )
select @@identity

我们可以看到,此时得到的标识值已经是100多了,很明显,这是表test2的生成的标识值,已经不是我们想要的了。

我们可以看看@@identity的定义:Identity

原来,@@identity返回的是当前事务最后插入的标识值。

这时我们或许会用下面的方法:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码四:
insert
into test1(content)
values ( ' solorez3 ' )
SELECT IDENT_CURRENT( ' test1 ' )

看来结果还比较正确,但如果我们在多次运行代码四的同时运行下面的代码五:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码五:
insert
into test1(content)
values ( ' solorez3 ' )

waitfor delay ' 00:00:20 '
SELECT IDENT_CURRENT( ' test1 ' )

结果又不是我们想要的了!

再看看IDENT_CURRENT(Tablename) 的定义:IDENT_CURRENT (Tablename)

是返回指定表的最后标识值。

到这里,是该亮出答案的时候了,我们可以使用下面的代码:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码六:
insert
into test1(content)
values ( ' solorez3 ' )

SELECT scope_identity ()

这时,我们无论是添加触发器还是运行并行插入,得到的始终是当前事务的标识值。

scope_identity()的定义:scope_identity ()

分享到:
评论

相关推荐

    sql20200215_sqlserver_sql批量插入_

    在SQL Server中,批量插入数据是一项常见的操作,尤其在处理大量数据时,高效的批量插入能够显著提高工作效率。本文将详细讲解如何使用SQL语句进行建表以及批量插入数据。 首先,我们来创建一个表。假设我们需要...

    SqlServer2005 打开 SqlServer2008 mdf文件

    Sql Server 2005 打开 Sql Server 2008 mdf 文件数据库转换是指将 Sql Server 2008 中的数据库文件(mdf 文件)转换为 Sql Server 2005 可以识别的格式,以便在 Sql Server 2005 中使用。这种转换过程需要使用 Sql ...

    C#向SQL Server中插入记录时的问题

    在C#中向SQL Server数据库插入记录时,经常会遇到一个问题,即当数据中包含单引号(')时,直接构建SQL语句会导致语法错误,因为单引号在SQL中用于标识字符串的开始和结束。为了解决这个问题,通常有两种处理方法:...

    SQLServer-让标识列重新开始计算

    ### SQL Server - 让标识列重新开始计算 ...通过以上介绍,我们可以了解到如何在SQL Server中使用`DBCC CHECKIDENT`命令来管理标识列的种子值,这对于维护数据库的健康状态以及优化性能都是非常有帮助的。

    SQL SERVER 双引号问题处理

    总之,通过合理设置 `QUOTED_IDENTIFIER`,可以在 SQL Server 中灵活地使用双引号界定字符串,解决字符串中包含单引号的问题。这不仅有助于提高代码的可读性和维护性,还能有效避免潜在的语法错误。

    SQL Server 之 SET IDENTITY_INSERT

    通过以上内容可以看出,`SET IDENTITY_INSERT`是一个非常实用的功能,能够帮助我们在SQL Server中更加灵活地管理标识列的值。正确理解和使用这个命令,对于数据库开发和维护工作来说是非常有帮助的。

    SQLServer存储过程中事务的使用方法

    在SQL Server中,事务是确保数据一致性的重要机制,特别是在存储过程中。存储过程是一组预编译的SQL语句,可以在数据库中被多次调用,提高了效率并降低了网络流量。本篇将详细介绍如何在SQL Server存储过程中使用...

    SQL server大作业

    在本“SQL Server大作业”中,我们主要探讨的是如何使用SQL Server进行数据库的设计与实现。这个作业可能包括了从需求分析、概念模型设计、逻辑结构设计到物理结构设计的全过程,同时也涉及到SQL语言的使用,如数据...

    CDC操作Sqlserver2008

    ### CDC操作Sqlserver2008 #### 概述 变更数据捕获(Change Data Capture,简称CDC)是SQL Server的一项重要功能,主要用于记录数据库表中的数据更改历史。这一功能在进行数据分析、日志记录、数据复制等场景下...

    SQLServer中防止并发插入重复数据的方法详解

    在SQL Server中,确保数据的一致性和完整性是数据库管理的核心任务之一。特别是在高并发环境下,如何防止多个事务同时插入重复数据成为一个重要的问题。本文将详细探讨几种有效的方法来解决这个问题。 1. **使用...

    sqlserver自动增长字段设置方法.rar

    在SQL Server中,每个表都可以有一个或多个自动增长字段,它们的值会随着新记录的插入而自动递增。这个特性使得我们无需手动为每条记录指定唯一的ID,系统会自动生成。 设置自动增长字段的步骤如下: 1. 创建新表...

    使用SQL Server 获取插入记录后的ID(自动编号)

    在SQL Server中,获取插入记录后的ID(通常指的是自动编号字段的值)是常见的操作,尤其是在需要关联新插入数据与其他表记录的情况下。本篇文章主要介绍了几种在SQL Server中获取自增ID的方法,针对SQL Server 2000...

    使用PowerDesigner设计SQL Server数据库

    在本文档中,我们将重点介绍如何使用PowerDesigner设计SQL Server数据库。 #### 二、概念数据模型(Conceptual Data Model, CDM) - **概念数据模型**是设计过程的第一步,主要目的是定义业务领域中的实体及其之间...

    SQL Server2005基本方法和语句

    在 SQL Server 2005 中,可以通过以下步骤实现数据库的备份: - 首先,需要添加一个备份设备: ```sql USE master; EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'; ``` - 然后...

    SQLServer高频面试题及答案

    触发器是数据库系统中的一种机制,可以在数据库中自动执行某些操作,如插入、更新、删除等。触发器可以用来维护数据的一致性和完整性。 4. 什么是存储过程? 存储过程是数据库中的一种程序单元,可以实现某些特定...

    在SQL Server数据库中为标识(IDENTITY)列插入显式值

    而在ASP程序中会返回错误信息: 引用内容 Microsoft OLE DB Provider for SQL Server 错误 ‘80040e14’ 当 IDENTITY_Insert 设置为 OFF 时,不能向表 ‘member’ 中的标识列插入显式值。

    SQLServer2005考试题及答案

    8. **字符串连接**:在SQL Server中,字符串连接通常使用加号"+",选项A。例如,`SELECT 'Hello' + 'World'`将返回'HelloWorld'。 9. **存储过程和脚本**:创建一个脚本执行存储过程并处理返回值,可以通过声明变量...

    SQL SERVER中自动标识列的改进.pdf

    本文讨论了SQL SERVER中自动标识列的两大限制:一是初始值只能是整型的数据,无法使用文本型数据或包含前导零的文本型数据;二是删除表中的记录或删除记录后再插入记录将导致表中的记录在该列上的值不连续。本文通过...

    SQL Server 中调整自增字段的当前初始值

    SQL Server 中调整自增字段的当前初始值是指在 SQL Server 中对自增字段的当前初始值进行调整,以解决自增字段的当前初始值与数据库维护的初始自增值不一致的问题。 在 SQL Server 中,自增字段的当前初始值可以...

    Sql Server 的SQL语句案例

    在Sql Server 2008中,常见的字段类型有bit(布尔值)、datetime(日期和时间)、int(整数)、varchar(可变长度的非Unicode字符串)和nvarchar(可变长度的Unicode字符串)。例如,nvarchar(50)能存储最多50个...

Global site tag (gtag.js) - Google Analytics