Я думаю, что вам не хватает ваших зависимостей. Пожалуйста, запустите
composer install
в корневом каталоге, чтобы установить зависимости
Спасибо всем, кто предложил SELECT SCOPE_IDENTITY (). Мне удалось создать хранимую процедуру:
USE [dbname]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spInsert]
(
@Nn varchar(30)
)
AS
BEGIN TRANSACTION InsertRecord
INSERT INTO A (Nn)
VALUES (@Nn)
SELECT NewID = SCOPE_IDENTITY() -- returns the new record ID of this transaction
COMMIT TRANSACTION InsertRecord
и вызвать sproc с помощью VB:
Dim strNn '<- var to be passed'
Set cn = Server.CreateObject("ADODB.Connection")
connectString = "DSN"
cn.Open connectString, "user", "PW0rd"
Set rs = Server.CreateObject("ADODB.Recordset")
set rs = cn.Execute("EXEC [dbname].[dbo].[A] @Nn=" & strNn)
'return the value'
resultID = rs(0)
Теперь я могу использовать resultID в любое время, когда ссылаюсь на вновь созданный идентификатор.
SELECT SCOPE_IDENTITY()
использование @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ могут иметь неожиданные результаты, так быть осторожными, как Вы используете тот. Триггеры, которые вставляют записи на другие таблицы, заставят @@ значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ изменяться - где SCOPE_IDENTITY () даст Вам последние идентификационные данные только от Вашей текущей области.
Вот образец, который это покажет различию между @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ и SCOPE_INSERT () и как они могут возвратить различные значения..
use tempdb
go
create table table1
(ID int identity)
go
create table table2
(ID int identity(100, 1))
go
create trigger temptrig
on table1
for insert
as
begin
insert table2
default values;
end
go
insert table1
default values;
select SCOPE_IDENTITY(),
@@IDENTITY
Другая опция, которую никто не обсудил здесь, состоит в том, чтобы использовать ВЫХОДНОЙ пункт, который находится в SQL 2005. В этом случае необходимо было бы просто добавить выходной пункт к вставке и затем поймать это recordset из кода. Это работает хорошо при вставке нескольких записей вместо всего 1...
use tempdb
go
create table table1
(ID int identity)
go
insert table1
output inserted.ID
default values;
--OR...
insert table1
output inserted.$identity
default values;
Вы выполняете запрос
select scope_identity()
использование того же соединения с базой данных, прежде, чем сделать что-либо еще с ним. Результат, как Вы, вероятно, ожидаете, официальный набор документов, содержащий одну строку, которая имеет единственное поле. Можно получить доступ к полю с помощью индекса 0, или можно дать ему имя, если Вы предпочитаете что:
select scope_identity() as lastId
ВЫБЕРИТЕ @@, ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ обычно работают, но могли возвратить идентификационные данные записи, вставленной из-за триггера или чего-то а не оригинала.
ИЗБРАННЫЙ SCOPE_IDENTITY - то, что я рекомендовал бы. Это возвращает значения вставленный только в текущей области.
Существует также "IDENT_CURRENT (имя таблицы)", которое возвращает последние идентификационные данные, вставленные для определенной таблицы.
Существует три способа получить последние идентификационные данные в sql.
Они были уже упомянуты другими, но для полноты:
Кроме того, существует три способа взять тот идентификатор и возвратить его Вашему клиентскому коду:
Используйте выходной параметр в хранимой процедуре
INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3);
SELECT @OutputParameterName = Scope_Identity();
Используйте возвращаемое значение.
INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3);
Return Scope_Identity();
Выберите идентификатор в набор результатов. Например, Ваш sql оператор выглядел бы примерно так:
Dim ResultID As Integer
Dim strSQL As String
strSQL = "INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); SELECT Scope_Identity();"
rsResults.Open strSQL, oConn
ResultID = rsResults("ID")
К сожалению (или к счастью, с моей точки зрения) мой Классик ASP это слишком далеко уведенный для показа примеров первых двух из клиентского кода.
Я всегда задавался вопросом, почему можно было бы когда-либо хотеть использовать
@@identity
с тех пор
select scope_identity()
очевидно, большинство, сохраняют способ выполнить то, что просит Scot.
ВЫБЕРИТЕ @@ Идентификационные данные или ВЫБЕРИТЕ SCOPE_IDENTITY (), обе работы, однако Выбирающие SCOPE_Identity (), более безопасны, потому что это возвращает последний автоматический сгенерированный идентификатор в Вашей текущей области. Так, например, предположите, что у нас есть таблица под названием ScopeIDTable, и на этой таблице у нас есть триггер. Этот триггер вставит в запись в TriggerIdTable, обе таблицы имеют столбец автоприращения.
При использовании ВЫБОРА @@ Идентификационные данные, Вы получите последний автоматический инкремент на той сессии, которая была бы идентификатором, сгенерированным из триггера (TriggerIdTable).
При использовании ИЗБРАННОГО SCOPE_IDENTITY (), Вы получите идентификатор от своего ScopeIdTable.
Где нескольким записям нужно к вставленному сразу в основанный на наборе вид, это может стать более интересным.
Я иногда использовал сгенерированную сторону клиента GUID (но для классического ASP необходимо будет, вероятно, использовать утилиту для генерации значений), или, чаще, NEWSQUENTIALID () ограничение на столбец ключа GUID в конце сервера.
Я знаю не все как GIUDS, хотя, по некоторым довольно допустимым причинам (их размер и как он влияет на индексацию/подкачку страниц для одной).
http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2