【问题标题】:sql server: is there a way to get last record inserted without stored procedure?sql server:有没有办法在没有存储过程的情况下插入最后一条记录?
【发布时间】:2011-04-01 18:25:56
【问题描述】:

有没有办法在多用户环境中插入最后一条记录而无需存储过程?

我通过 vba 连接到 sql server。我插入一些记录并调用:

SELECT SCOPE_IDENTITY()

这不起作用。它每次都返回null。

这是完整的代码:

Dim sqlstring1 As String
sqlstring1 = "delete from batchinfo where datapath='" & dpath & "' and analystname='" & aname & "' and reportname='" & rname & "' and batchstate='" & bstate & "'"



Dim rowid_batchinfo As String
rs.Filter = "datapath='" + dpath + "' and analystname='" + aname + "' and reportname='" + rname + "' and batchstate='" + bstate + "'"
If Not rs.EOF Then
    rowid_batchinfo = rs.Fields("rowid")
    cn.Execute "delete from batchinfo where rowid=" + rowid_batchinfo
    cn.Execute "delete from calibration where rowid='" + rowid_batchinfo + "'"
    cn.Execute "delete from qvalues where rowid='" + rowid_batchinfo + "'"
End If


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



Set rs = cn.Execute("SELECT SCOPE_IDENTITY()", , adCmdText)

Set rs = rs.NextRecordset

问题是如何在多用户环境中插入最后一条记录?

【问题讨论】:

    标签: sql sql-server vba


    【解决方案1】:

    来自docs

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

    这意味着您应该在同一批次(即SQL 调用)中发送SCOPE_IDENTITY 与您的插入查询。

    这对于AddNew 之类的方法是不可能的,因此您应该使用显式的INSERT 语句,后跟SELECT SCOPE_IDENTITY

    类似这样的:

    SQL = "INSERT INTO mytable (datapath, analysistype, …) VALUES (@datapath, @analysistime, …) SELECT SCOPE_IDENTITY()"
    Set cmd = Server.CreateOject("ADODB.Command")
    With cmd
          .CommandType = adCmdText
          .CommandText = SQL
          .Parameters.Append .CreateParameter("@datapath", adVarWChar, adParamInput,, dpath)
          …
    End With
    Set rs = cmd.Execute
    Set rs = rs.NextRecordset
    

    【讨论】:

    【解决方案2】:

    这是我在我的 sp 中使用的:

    ALTER PROCEDURE [dbo].[usp_app_execSQL_insert] (@SQL AS text)
    AS
    
    set nocount on
    
    exec(@sql + ' select scope_identity()')
    
    --select @@identity  --works, but returns value from session scope, not insert scope.
    --return @@identity  --doesn't work
    --exec(@sql) return/select scope_identity()     -- doesn't work (insert outside scope)
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 2019-12-03
      • 2014-07-13
      • 1970-01-01
      • 2019-08-01
      • 2020-03-22
      • 2010-12-29
      • 1970-01-01
      相关资源
      最近更新 更多