Подтвердить что ты не робот

Получите последний вставленный идентификатор строки (с выражением SQL)

Я хочу получить новый созданный идентификатор, когда вы вставляете новую запись в таблицу.

Я читал это: http://msdn.microsoft.com/en-us/library/ms177564.aspx, но ему нужно создать временную таблицу.

Я хочу вернуть идентификатор после выполнения инструкции INSERT (предполагая выполнение только одного INSERT).

Пример:

1     Joe      Joe
2     Michael  Mike
3     Zoe      Zoe

При выполнении инструкции INSERT я хочу вернуть созданный идентификатор, значит 4.

Может мне сказать, как это сделать с помощью инструкции SQL или это невозможно?

4b9b3361

Ответ 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 возвращает значение идентификатора, сгенерированное для конкретной таблицы, в любом сеансе и в любой области.