Sql server sql server:如何获取插入的最后一条记录?

Sql server sql server:如何获取插入的最后一条记录?,sql-server,sql-server-2008,vba,Sql Server,Sql Server 2008,Vba,我正在这样做: With rs .AddNew ' create a new record ' add values to each field in the record .Fields("datapath") = dpath .Fields("analysistime") = atime .Fields("reporttime") = rtime .Fields("lastcalib") = lcalib .Fields("analys

我正在这样做:

With rs
    .AddNew ' create a new record
    ' add values to each field in the record
    .Fields("datapath") = dpath
    .Fields("analysistime") = atime
    .Fields("reporttime") = rtime
    .Fields("lastcalib") = lcalib
    .Fields("analystname") = aname
    .Fields("reportname") = rname
    .Fields("batchstate") = bstate
    .Fields("instrument") = instrument
    .Update ' stores the new record
End With

' get the last id
Set rs = cn.Execute("SELECT SCOPE_IDENTITY()", , adCmdText)

这不正常。它正在返回NULL,因为您的更新和第二次执行在不同的范围内,所以它不起作用。
您可能希望选择IDENT_CURRENT('tablename')

IDENT_CURRENT在单用户环境中很好

更新时,您已记录在案

.Update
lTheNewID = .Fields("ThisTableID")

lTheNewID将保留新记录的价值。

可能重复这一点很好,但我认为这是不对的。我将作用域标识放在WITH子句中,但仍然得到NULL returnedit表示作用域函数需要0 arguemntsNo,您的更新称为它自己的execute。然后调用第二个execute来获取标识。总之,SCOPE_IDENTITY()在必须同时发生的存储过程中最有用。使用“with rs”并不意味着在这个regardSELECT IDENT_CURRENT('tablename')中使用“全部执行或不执行”将返回表中最新的Identity autonum存储过程稍微超出了这个问题的范围,但基本思想是创建一个接受参数的过程。它们可以像任何SQL语句“StoredProcedureName”(参数1、参数2……)一样执行然后,在存储过程中添加事务所需的所有步骤。这可确保所有内容都在同一范围内一次性提交。我几乎总是尝试在DB事务中使用过程。此链接可能会让您开始:除非您在存储过程中使用它,否则我会避免它。我同意Jeff O,正如我的回答中所说的,我会考虑使用存储过程来确保所有事务发生,并且得到的ID是您正在寻找的。