Получите последний вставленный идентификатор строки (с выражением SQL)
Я хочу получить новый созданный идентификатор, когда вы вставляете новую запись в таблицу.
Я читал это: http://msdn.microsoft.com/en-us/library/ms177564.aspx, но ему нужно создать временную таблицу.
Я хочу вернуть идентификатор после выполнения инструкции INSERT (предполагая выполнение только одного INSERT).
Пример:
1 Joe Joe
2 Michael Mike
3 Zoe Zoe
При выполнении инструкции INSERT я хочу вернуть созданный идентификатор, значит 4.
Может мне сказать, как это сделать с помощью инструкции SQL или это невозможно?
Ответы
Ответ 1
Если ваша таблица SQL Server имеет столбец типа INT IDENTITY
(или BIGINT IDENTITY
), вы можете получить последнее вставленное значение, используя:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
Это работает до тех пор, пока вы не вставили еще одну строку - она возвращает только последнее значение IDENTITY
, указанное в этой области.
Есть как минимум еще две опции - @@IDENTITY
и IDENT_CURRENT
- читайте больше о том, как они работают и как они отличаются (и могут дать вам неожиданные результаты) в этом отличный пост в блоге Пинала Дейва здесь.
Ответ 2
Предполагая простую таблицу:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
Мы можем записать значения IDENTITY
в переменной таблицы для дальнейшего потребления.
DECLARE @IDs TABLE(ID INT);
-- minor change to INSERT statement; add an OUTPUT clause:
INSERT dbo.foo(name)
OUTPUT inserted.ID INTO @IDs(ID)
SELECT N'Fred'
UNION ALL
SELECT N'Bob';
SELECT ID FROM @IDs;
Самое приятное в этом методе: (a) он обрабатывает многострочные вставки (SCOPE_IDENTITY()
возвращает только последнее значение), и (b) он избегает это ошибка parallelism, которая может привести к неправильным результатам, но пока что исправлена только в SQL Server 2008 R2 SP1 CU5.
Ответ 3
Вы можете использовать:
SELECT IDENT_CURRENT(‘tablename’)
чтобы получить доступ к последнему идентификатору для таблицы в виде таблицы.
например. Учитывая следующий код:
INSERT INTO dbo.MyTable(columns....) VALUES(..........)
INSERT INTO dbo.YourTable(columns....) VALUES(..........)
SELECT IDENT_CURRENT(‘MyTable’)
SELECT IDENT_CURRENT(‘YourTable’)
Это приведет к правильному значению соответствующих таблиц.
Он возвращает последнее значение IDENTITY
, созданное в таблице, независимо от соединения, которое создало это значение, и независимо от области действия оператора, который произвел значение.
IDENT_CURRENT
не ограничивается областью действия и сеансом; он ограничен указанной таблицей. IDENT_CURRENT
возвращает значение идентификатора, сгенерированное для конкретной таблицы, в любом сеансе и в любой области.