如何获取一个表标识列值以及如何在存储过程中使用该值

Posted

技术标签:

【中文标题】如何获取一个表标识列值以及如何在存储过程中使用该值【英文标题】:How to get one table identity column value and how to use that value in stored procedure 【发布时间】:2013-01-18 12:42:27 【问题描述】:

我有两张桌子UserInfoUserContact。我使用标识列 (ID) 成功地将数据插入到 UserInfo 表中。我正在使用存储过程向表中插入数据。

UserInfo (Id, FirstName, LastName, Address)   
Usercontact(Id, UserInfoId, ContactNumber)

我想插入第二个表。如何从第一个表中获取 ID 以及该 ID 如何在第二个表的存储过程中使用。

【问题讨论】:

需要知道您使用的是哪个 DBMS(和版本)。 SQL Server? 【参考方案1】:

对于 SQL SERVER: 使用 SCOPE_IDENTITY (Transact-SQL):返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句在同一个存储过程、函数或批处理中,则它们属于同一范围。

例如:

Insert Into UserInfo (FirstName,LastName,Address) 
Values (@FirstName,@LastName,@Address);

Declare @id int
SELECT @id = SCOPE_IDENTITY();

Insert Into Usercontact (Id,UserInfoId,ContactNumber) 
Values (@id,@UserInfoId,@ContactNumber);

【讨论】:

感谢 KPL 的回复。我用两个表插入编写了 stroed 过程。但是当我尝试执行第一个表时它显示错误。【参考方案2】:

您可以使用 Scope_identity() 或 IDENT_CURRENT('tablename')

SELECT SCOPE_IDENTITY() 它返回连接上和同一范围内的语句生成的最后一个 IDENTITY 值,而不管生成该值的表是什么。 SCOPE_IDENTITY() 与@@IDENTITY 一样,将返回在当前会话中创建的最后一个身份值,但它也会将其限制在您当前的范围内。换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识。

SELECT IDENT_CURRENT(‘tablename’) 它返回表中生成的最后一个 IDENTITY 值,与创建该值的连接无关,也与生成该值的语句的范围无关。 IDENT_CURRENT 不受范围和会话限制;它仅限于指定的表。 IDENT_CURRENT 返回为任何会话和任何范围内的特定表生成的标识值。

*注意:为避免与稍后添加触发器相关的潜在问题,请始终使用 SCOPE_IDENTITY() 来返回您的 T SQL 语句或存储过程中最近添加的行的标识。*

更多内容请参考这篇博文

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

【讨论】:

以上是关于如何获取一个表标识列值以及如何在存储过程中使用该值的主要内容,如果未能解决你的问题,请参考以下文章

如何将列值从存储过程中的另一个表更新到表中?

PL/SQL:如何根据列值插入

数据库优化之创建索引

如何使用plsql导出oracle数据建表语句,存储过程,视图.以及表中数据

在使用表中的连接列值填充列表框时,如何检索相应的 ID 并传递值 onchange [关闭]

如何获取雪花中执行存储过程的名称?