【问题标题】:sql server: how do i get the last record that was inserted?sql server:如何获取插入的最后一条记录?
【发布时间】:2010-08-20 13:01:26
【问题描述】:

我正在这样做:

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

【问题讨论】:

标签: sql-server sql-server-2008 vba


【解决方案1】:

它不起作用,因为您的更新和您的第二次执行在不同的范围内。 你可能想要 SELECT IDENT_CURRENT('tablename')

【讨论】:

  • 这是一个很好的观点,但我认为它不正确。我将范围标识放在 WITH 子句中,仍然返回 NULL
  • 表示作用域函数需要 0 个参数
  • 不,您的更新称为它自己的执行。然后,您将调用第二次执行以获取身份。恕我直言,SCOPE_IDENTITY() 在必须同时发生的存储过程中最有用。在这方面,使用“with rs”并不意味着“做所有或什么都不做”
  • SELECT IDENT_CURRENT('tablename') 将从表中返回最新的 Identity autonum
  • 存储过程有点超出这个问题的范围,但基本思想是创建一个接受参数的过程。它们可以像任何 SQL 语句一样执行“StoredProcedureName(Parameter1, Parameter2......) 然后,在存储过程中添加事务所需的所有步骤。这样可以确保所有内容都提交一次,同时在相同的范围。我几乎一直都在尝试对数据库事务使用过程。这个链接可能会让你开始:sql-server-performance.com/articles/dba/…
【解决方案2】:

IDENT_CURRENT 在单用户环境中很好。

更新时你已经在记录中了。

.Update
lTheNewID = .Fields("ThisTableID")

lTheNewID 将保存新记录的值。

【讨论】:

  • 除非你在存储过程中使用它,否则我会避免它。
  • 我同意 Jeff O 的观点,如我的回答中所述。我会考虑使用存储过程来确保所有事务都发生;生成的 ID 就是您要查找的内容。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 2015-05-21
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多