1,http://www.cnblogs.com/ahuo/archive/2008/01/24/1051112.html
当运行完插入语句后,执行select @@identity就可得到自动生成的id
如果是sql server 最好用select SCOPE_IDENTITY() as id
因为@@identity全局的
同类还有IDENT_CURRENT(‘table’)
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值
SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
==============================================================================
2,http://www.cnblogs.com/ghostljj/archive/2007/09/05/883304.html
示例:
INSERT INTO tablename
(Content,SameID)
VALUES ('内容',0)
; UPDATE tablename SET SameID=@@IDENTITY WHERE ID=@@IDENTITY
;SELECT @@IDENTITY
解析
; UPDATE tablename SET SameID=@@IDENTITY WHERE ID=@@IDENTITY
更新一个相同的列,用于例如要和ID自增列相同的结果
;SELECT @@IDENTITY
代码告诉 SQL Server 不要返回查询的行计数,然后执行 INSERT 语句,并返回刚刚为这个新行创建的 IDENTITY 值。
==============================================================================
3
如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY
说明:
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。
在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。
@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。
示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。
INSERT INTO infoclass (infoclass) VALUES ('Accountant')
这时我们插入一条记录,下面我们使用语句得到标识值:
SELECT @@IDENTITY AS 'Identity'
我的表infoclass中有个ID字段,它原的值是14插入新的记录后自动产生了值15,因些,上面命令执行后返回值:15。
下面说说如何在.NET中得到插入记录后的ID值。
因为Sqlserver为我们提供了多重查询的功能,这大大方便了我们的工作。请看:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
上面可以看到,SqlCommand可以执行多条语句,各语句之间用“;"分隔。第一条执行插入,第二条则返回最后插入记录的ID值,因为查询返回的是单列的,并且值也是唯一的,所以可以使用ExecuteScalar获得:
Dim jobId As Integer = CInt(cmd.ExecuteScalar())
==============================================================================
插入记录后,获取记录的ID
基本知识
1. IDENTITY 列不能由用户直接更新,它是由系统自动维护的。
2.该列数据类型必须为数值型:int, smallint, tinyint, decimal or numeric with scale 0。
3.该列不能为 null。
4.不能在该列上设置缺省值。
5.递增量只能为整形(比如:1,2,-3)。不能为小数,也不能为0。
6.基值(种子值 seed)可以由用户设置,缺省值为1。
理解 @@IDENTITY
@@IDENTITY 返回最后一个插入 IDENTITY 的值,这些操作包括:INSERT, SELECT INTO,或者 bulk copy。如果在给没有 IDENTITY 列的其他表插入记录,系统将其置为 null。如果有多行记录插入到 IDENTITY 表中,@@IDENTITY 表示最后一个产生的值。如果触发了某个触发器,并且这个触发器执行向另一个带有 IDENTITY 列的表的插入操作,@@IDENTITY 将返回这个由触发器产生的值。如果这个触发器插入的表中不包含 IDENTITY 列,那么 @@IDENTITY 将为 null。如果插入操作失败,@@IDENTITY 值依然会增加,所以 IDENTITY 不保证数据的连续性。
@@IDENTITY 是当前连接的全局变量,只对当前连接有效。也就是说,如果断开连接再重新连接后,@@IDENTITY 为 null。以 ADO 来说,@@IDENTITY 在 Connection 对象打开和关闭期间是有意义的,即在 Connection 对象的存在范围内有效。在 MTS 组件中,从打开连接到显式的关闭连接(Connection.Close)或者到调用了 SetAbort,SetComplete之前,在这期间,@@IDENTITY 有意义。
使用 Truncate table 语句会使 IDENTITY 列重新开始计算。
得到 @@IDENTITY 的值
有三种方法(以下代码均使用 VBScript)
方法一:
Dim Conn, strSQL, Rs
Set Conn = CreateObject("ADODB.Connection")
’ Open a connection to the database
Conn.Open("DSN=myDSN;;UID=myUID;;PWD=myPWD;;")
’ Insert a new record into the table
strSQL = "INSERT INTO mtTable (columnName) valueS (’something’)"
’ Execute the SQL statement
Conn.Execute(strSQL)
’ Get the @@IDENTITY.
strSQL = "SELECT @@IDENTITY AS NewID"
Set Rs = Conn.Execute(lsSQL)
NewID = Rs.Fields("NewID").value
’ Close the connection
Conn.Close()
Set Conn = Nothing
方法二(仅限于 ADO 2.0 以上):
Dim Conn, strSQL, Rs
Set Conn = CreateObject("ADODB.Connection")
’ Open a connection to the database
Conn.Open("DSN=myDSN;;UID=myUID;;PWD=myPWD;;")
’ Insert a new record into the table
lsSQL = "INSERT INTO myTable (columnName) valueS (’something’);;" &_
"SELECT @@IDENTITY AS NewID;;"
’ Execute the SQL statement
Set Rs = Conn.Execute(lsSQL)
’ Get the second resultset into a RecordSet object
Set Rs = Rs.NextRecordSet()
’ Get the inserted ID
NewID = Rs.Fields("NewID").value
’ Close the connection
Conn.Close()
Set Conn = Nothing
方法三:
Dim Conn, strSQL, Rs
Set Conn = CreateObject("ADODB.Connection")
’ Open a connection to the database
Conn.Open("DSN=myDSN;;UID=myUID;;PWD=myPWD;;")
’ Insert a new record into the table
strSQL = "SET NOCOUNT ON;;" &_
"INSERT INTO myTable (columnName) valueS (’something’);;" &_
"SELECT @@IDENTITY AS NewID;;"
’ Execute the SQL statement
Set Rs = Conn.Execute(lsSQL)
’ Get the inserted ID
NewID = Rs.Fields("NewID").value
’ Close the connection
Conn.Close()
Set Conn = Nothing
==============================================================================