sql语句新增记录时获取自增字段的方法
2011-03-15 18:33
274 查看
一、问题提出 假设数据库有表 A(AID int Identity, ...) B(BID int ,AID int, ...) 其中A中AID为自增(Identity)字段且作为主键,B中AID即为A表主键。 当写程序时向A表插入一条新数据,并将这条新纪录对应信息写入表B,此时便会有一个问题,在我们写程序时,这条记录的Id我们还不知道,那么如何向表B中写呢。 二、解决办法 Insert Into A..这个存储过程时,定义一个输出参数@result int output,而返回值有两种取法 1. 使用系统预定义变量@@Identity 存储过程结尾为, set @Result = (select @@Identity from A)。 其中,@@Identity是一个系统预定义的变量,它表示当前事务内, 最新的一个 标识值,就是一个 identity 列的最新值。 2. 取表中的identity列的最大值 @Result = (select max([AID]) from A ) -------------------------------------------- INSERT INTO [dbo].[aaa] ([aa], [bb], [cc]) VALUES (@aa, @bb, @cc); SELECT id, aa, bb, cc FROM aaa WHERE (id = SCOPE_IDENTITY()) select @@identity 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 值。 -------------------------------------------------------------- 多用户环境下用这个好一点 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*/ ----------------------------------------------- sql server 自增字段,插入一条记录后如何获得当前插入记录的自增字段的值? 经过实验,得如下结论: select DISTINCT @@IDENTITY as iden from FaWen 解释:上述语句对 SQL SERVER 的一个会话,也就是一条连接,返回该连接最后一条插入记录得到的自增字段的值。 假设有3个程序,分别连接SQL SERVER,有三个连接。3个程序都向同一个表依顺序插入数据,得到的值分别是1、2、3,那么,只要3个程序对SQL的连接还保持着,第一个程序使用上述语句,将得到1,而不是3,第二个程序将得到2,也不是3。第三个程序得到3。 因此,用上述语句可以得到自己刚才插入记录的自增字段的值,不怕其它程序的并发插入操作。 上述语句中,使用 DISTINCT 的原因是,虽然返回的值是当前连接插入操作得到的最大值,但返回的相同值的记录有多条。条数等于当前多个连接一共插入的记录数。 实验方法:启动三个 Query analyzer 查询分析器,分别执行插入操作后再做上述取自增字段值的操作 我利用 rs.addnew 增加一条记录时,如何同时获取自增1字段ID的当前值,而无须再进行一次查询来获取!因为我立即要用到该ID值,如果在增加记录完毕后再利用select id 进行一次查询无疑会使系统受限,有办法吗? 如果你能保证id=行数的话可以用 rs.moveend '当指针在最后一条记录时count是全部行数 rs.count |
相关文章推荐
- 用SQL语句查询数据库中某一字段下相同值的记录方法
- 用SQL语句查询数据库中某一字段下相同值的记录方法
- sql批量更新字段值,sql所有字段的所有记录替换方法,sql获取所有字段并更新
- 用SQL语句查询数据库中某一字段下相同值的记录方法
- SQL语句分组获取记录的第一条数据的方法
- SQL语句分组获取记录的第一条数据的方法
- SQL语句分组获取记录的第一条数据的方法
- 获取SQL Server数据库中所有库、表、字段名的方法(sql语句)
- 关于Oracle与SqlServer中获取所有字段、主键、外键的sql语句
- 查询出某字段值不为空的记录的SQL语句怎么写
- sql 语句去重复字段记录
- SQL语句删除重复的记录的方法
- SQL语句在表中新增字段(列)
- Oracle 获取表带字段备注SQL语句存储过程
- 关于Oracle与SqlServer中获取所有字段、主键、外键的sql语句
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- 巧用C# Split()函数获取SQL语句中操作字段
- SQL语句实现删除ACCESS重复记录的两种方法
- sqlite获取几条记录的SQL语句
- 用SQL查询数据库中某一字段下相同值的记录方法