Transact-SQL 返回最新插入行的标识

我们经常会遇到以下问题,即如何获取最新插入记录的标识?

这样的需求很常见,下面就来介绍Transact-SQL提供的三种获取标识的方法。
(1) IDENT_CURRENT
返回为某个会话和用域中的指定表生成的最新标识值。
(2) @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
(3)
SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

(1) IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。
   
语法:IDENT_CURRENT( ‘table_name‘ )
   
说明:通过IDENT_CURRENT获取的最新标识是不管会话和作用域的,也就是说无论什么人向指定的表插入新行,它只获取该表最新行的标识。
   
示例:打开两个查询窗口(两个会话),分别在这两个查询窗口中写上INSERT语句,并插入到同一张表。
         
在任意一个查询窗口中写上SELECT IDENT_CURRENT( ‘table_name‘
);
         
结果发现SELECT的返回值是该表最后一次插入时生成的标识。
   
备注:如果你想获取自己刚才插入的行标识,建议不要用这个方法;
         
如果你想获取整个表最新插入的行标识,建议用这个方法;

(2) @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
   
语法:@@IDENTITY
   
说明:首先@@IDENTITY获取的是当前会话,也就是说不会获取别人插入的新行标识。它和SCOPE_IDENTITY唯一不同的区别在于,@@IDENTITY是跨作用域的,而SCOPE_IDENTITY是当前作用域。
   
示例:两个表A和B,表A建立触发器,一旦增加新记录,触发器会向表B添加一条新记录。
         
向表A添加一条记录。
          获取最新标识
SELECT @@IDENTITY;
         
结果发现返回的是表B中新行的标识。
   
备注:如果你的当前会话中仅对一个表新增,那么完全可以用@@IDENTITY获取最新插入的行标识。
         
如果有触发器他插入,则不能使用该方法。

(3) SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。
   
语法:SCOPE_IDENTITY()
    说明:该方法获取最新行标识和@@IDENTITY
类似。只是作用域是当前作用域。
   
示例:方法同(2);
         
结果发现返回值是表A新增的行标识。
   
示例:打开两个查询窗口(两个会话),分别在这两个查询窗口中写上INSERT语句,并插入到同一张表。
         
在任意一个查询窗口中写上SELECT
SCOPE_IDENTITY();
         
结果发现SELECT的返回值是该窗口所插入的那一行的标识。
   
备注:如果你要获取最新插入的行标识,这个方法是最可靠的。

Transact-SQL 返回最新插入行的标识,布布扣,bubuko.com

时间: 2024-12-16 05:56:22

Transact-SQL 返回最新插入行的标识的相关文章

SQL 返回刚插入数据的ID

处理方法在某个字段上加上identity id int identity(1,1), 创建标识的三种方法及比较: SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY. IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值. IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值.IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表.IDENT_CURRENT 返回

我纠结的sql返回受影响行数与判断是否成功的问题

比如:deleteSQLWhere="delete TableA where ID in(1,2,3,4,5)"; try { int i = sqlHelper.ExecuteNonQuery(CommandType.Text, deleteSQLWhere); if (i > 0) { return true; } } catch (Exception ex) { LogMsg.WriteLog(ex.ToString()); return false; } return f

sql返回前N行

场景:返回每个客户最近的3个订单. 假设我们已经有一个POC索引(详情见http://www.cnblogs.com/xiaopotian/p/6821502.html),有两种策略来完成该任务:一种是使用ROW_NUMBER函数:另一种使用APPLY运算符和OFFSET/FETCH或TOP,哪一种策略更有效由分区列(custid)的密度来决定.低密度--意味着有大量不同的客户,每个客户订单都很小--基于ROW_NUMBER函数的解决方案是最佳的. with C as ( select cust

EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值

一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过 using (var ctx = new MyDbContext()) { ctx.Database.ExecuteSqlCommand("UPDATE Person SET Name = 'Michael' WHERE PersonID = 1"); } 二 : Database.SqlQuery<T>   EF5执行sql查询语句

sas中的sql(6)创建表格、展现表格、插入行、删除行、规定限制条件(constriants)、处理输入错误(undo策略)、update表格、更改列

1:三种建表方式 建表只会在库中建立好表格并在日志中显示,并不会有输出. 1.1:自己定义列来建立一张空表 column-specification = column-define + column-constriants + MESSAGE=/MSGTYPE SAS中数据的存储方式只有两种,一种char(n)一种num.sas也支持sql原生的数据类型,但是最终都会统一转化为这两种 proc sql; create table work.departments (Dept varchar(20

获取最新插入数据的ID(转)

SQL Server 2000中,insert数据的时候返回自动编号的id,有三种方法实现SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值. IDENT_CURRENT :返回为任何会话和任何作用域中的特定表最后生成的标识值.IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表.IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值. @@IDENTITY: 返回为当前会话的所有作用域

mysql 获取刚插入行id汇总

mysql 获取刚插入行id汇总 我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的.但在多线程情况下,就不行了. 下面介绍三种方法 (1) getGeneratedKeys()方法: 程序片断: Connection conn = ;        Serializable ret = null;        PreparedStatement state = .;       

使用SQLServer2005插入一条数据时返回当前插入数据的ID

在执行完插入后 再执行 select @@identity from users 就OK 就是刚才插入的那行的 ID了 补充: @@identity 表示当前新增的主键ID 这个是在一个session中查找的, SELECT MAX(id) FROM Users 执行这个查询,就可以返回最新的ID   来自为知笔记(Wiz)

ASP.NET MVC与Sql Server交互, 插入数据

在"ASP.NET MVC与Sql Server建立连接"中,与Sql Server建立了连接.本篇实践向Sql Server中插入数据. 在数据库帮助类中增加插入数据的方法. public class SqlDB { protected SqlConnection conn; //打开连接 public bool OpenConnection() { conn = new SqlConnection(ConfigurationManager.ConnectionStrings[&qu