数据库实际应用中,我们往往需要得到刚刚插入的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?
有时我们会使用
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
()
分享到:
相关推荐
在SQL Server中,批量插入数据是一项常见的操作,尤其在处理大量数据时,高效的批量插入能够显著提高工作效率。本文将详细讲解如何使用SQL语句进行建表以及批量插入数据。 首先,我们来创建一个表。假设我们需要...
Sql Server 2005 打开 Sql Server 2008 mdf 文件数据库转换是指将 Sql Server 2008 中的数据库文件(mdf 文件)转换为 Sql Server 2005 可以识别的格式,以便在 Sql Server 2005 中使用。这种转换过程需要使用 Sql ...
在C#中向SQL Server数据库插入记录时,经常会遇到一个问题,即当数据中包含单引号(')时,直接构建SQL语句会导致语法错误,因为单引号在SQL中用于标识字符串的开始和结束。为了解决这个问题,通常有两种处理方法:...
### SQL Server - 让标识列重新开始计算 ...通过以上介绍,我们可以了解到如何在SQL Server中使用`DBCC CHECKIDENT`命令来管理标识列的种子值,这对于维护数据库的健康状态以及优化性能都是非常有帮助的。
总之,通过合理设置 `QUOTED_IDENTIFIER`,可以在 SQL Server 中灵活地使用双引号界定字符串,解决字符串中包含单引号的问题。这不仅有助于提高代码的可读性和维护性,还能有效避免潜在的语法错误。
通过以上内容可以看出,`SET IDENTITY_INSERT`是一个非常实用的功能,能够帮助我们在SQL Server中更加灵活地管理标识列的值。正确理解和使用这个命令,对于数据库开发和维护工作来说是非常有帮助的。
在SQL Server中,事务是确保数据一致性的重要机制,特别是在存储过程中。存储过程是一组预编译的SQL语句,可以在数据库中被多次调用,提高了效率并降低了网络流量。本篇将详细介绍如何在SQL Server存储过程中使用...
在本“SQL Server大作业”中,我们主要探讨的是如何使用SQL Server进行数据库的设计与实现。这个作业可能包括了从需求分析、概念模型设计、逻辑结构设计到物理结构设计的全过程,同时也涉及到SQL语言的使用,如数据...
### CDC操作Sqlserver2008 #### 概述 变更数据捕获(Change Data Capture,简称CDC)是SQL Server的一项重要功能,主要用于记录数据库表中的数据更改历史。这一功能在进行数据分析、日志记录、数据复制等场景下...
在SQL Server中,确保数据的一致性和完整性是数据库管理的核心任务之一。特别是在高并发环境下,如何防止多个事务同时插入重复数据成为一个重要的问题。本文将详细探讨几种有效的方法来解决这个问题。 1. **使用...
在SQL Server中,每个表都可以有一个或多个自动增长字段,它们的值会随着新记录的插入而自动递增。这个特性使得我们无需手动为每条记录指定唯一的ID,系统会自动生成。 设置自动增长字段的步骤如下: 1. 创建新表...
在SQL Server中,获取插入记录后的ID(通常指的是自动编号字段的值)是常见的操作,尤其是在需要关联新插入数据与其他表记录的情况下。本篇文章主要介绍了几种在SQL Server中获取自增ID的方法,针对SQL Server 2000...
在本文档中,我们将重点介绍如何使用PowerDesigner设计SQL Server数据库。 #### 二、概念数据模型(Conceptual Data Model, CDM) - **概念数据模型**是设计过程的第一步,主要目的是定义业务领域中的实体及其之间...
在 SQL Server 2005 中,可以通过以下步骤实现数据库的备份: - 首先,需要添加一个备份设备: ```sql USE master; EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'; ``` - 然后...
触发器是数据库系统中的一种机制,可以在数据库中自动执行某些操作,如插入、更新、删除等。触发器可以用来维护数据的一致性和完整性。 4. 什么是存储过程? 存储过程是数据库中的一种程序单元,可以实现某些特定...
而在ASP程序中会返回错误信息: 引用内容 Microsoft OLE DB Provider for SQL Server 错误 ‘80040e14’ 当 IDENTITY_Insert 设置为 OFF 时,不能向表 ‘member’ 中的标识列插入显式值。
8. **字符串连接**:在SQL Server中,字符串连接通常使用加号"+",选项A。例如,`SELECT 'Hello' + 'World'`将返回'HelloWorld'。 9. **存储过程和脚本**:创建一个脚本执行存储过程并处理返回值,可以通过声明变量...
本文讨论了SQL SERVER中自动标识列的两大限制:一是初始值只能是整型的数据,无法使用文本型数据或包含前导零的文本型数据;二是删除表中的记录或删除记录后再插入记录将导致表中的记录在该列上的值不连续。本文通过...
SQL Server 中调整自增字段的当前初始值是指在 SQL Server 中对自增字段的当前初始值进行调整,以解决自增字段的当前初始值与数据库维护的初始自增值不一致的问题。 在 SQL Server 中,自增字段的当前初始值可以...
在Sql Server 2008中,常见的字段类型有bit(布尔值)、datetime(日期和时间)、int(整数)、varchar(可变长度的非Unicode字符串)和nvarchar(可变长度的Unicode字符串)。例如,nvarchar(50)能存储最多50个...