sql server: есть ли способ вставить последнюю запись без хранимой процедуры? - PullRequest
2 голосов
/ 20 августа 2010

есть ли способ вставить последнюю запись без хранимой процедуры в многопользовательской среде?

Я подключен к серверу SQL через VBA.я вставляю некоторые записи и звоню:

SELECT SCOPE_IDENTITY()

это не работает.он возвращает ноль каждый раз.

вот весь код:

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

вопрос в том, как мне вставить последнюю запись, вставленную в многопользовательскую среду?

Ответы [ 2 ]

3 голосов
/ 20 августа 2010

Из документов :

Возвращает последнее значение идентификатора, вставленное в столбец идентификатора в той же области.Область действия - это модуль: хранимая процедура, триггер, функция или пакет.Поэтому два оператора находятся в одной и той же области, если они находятся в одной и той же хранимой процедуре, функции или пакете.

Это означает, что вы должны отправить SCOPE_IDENTITY в одном пакете (то есть SQLcall) с вашим запросом вставки.

Это невозможно с такими методами, как 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
1 голос
/ 20 августа 2010

Это то, что я использую в моем 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...