Как вернуть новое значение столбца IDENTITY из инструкции SELECT SQLServer?

Я вставляю в таблицу SQLServer с полем автоинкрементного ключа. (Я считаю, что это называется столбцом IDENTITY в SQLServer.)

В Oracle я могу использовать ключевое слово RETURNING, чтобы дать моей инструкции INSERT результат, заданный как запрос SELECT, который вернет сгенерированное значение:

INSERT INTO table
(foreign_key1, value)
VALUES
(9, 'text')
RETURNING key_field INTO :var;

Как это сделать в SQLServer?

Бонус: Хорошо, хорошие ответы до сих пор, но как я могу поместить его в одно выражение, если это возможно?:)

Ответ 1

В общем, это невозможно сделать в одном выражении.

Но SELECT SCOPE_IDENTITY() может (и должен) размещаться непосредственно после инструкции INSERT, поэтому все это делается в одном вызове базы данных.

Пример:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");

Вы можете использовать OUTPUT, но у него есть некоторые ограничения, о которых вам следует знать:

http://msdn.microsoft.com/en-us/library/ms177564.aspx

Ответ 2

SELECT SCOPE_IDENTITY()

Изменить: иметь игру...

Если предложение OUTPUT поддерживает локальные переменные.

В любом случае, чтобы получить диапазон идентификаторов, а не однострочный

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
SELECT 'harry'
UNION ALL
SELECT 'dick'
UNION ALL
SELECT 'tom'

Изменить 2: за один вызов. Мне никогда не приходилось использовать эту конструкцию.

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')

Ответ 3

Помимо @@IDENTITY, вы также должны посмотреть в SCOPE_IDENTITY() и IDENT_CURRENT(). Скорее всего, вы хотите SCOPE_IDENTITY(). @@IDENTITY имеет проблему в том, что он может вернуть значение идентификатора, созданное в триггере фактической таблицы, которую вы пытаетесь отслеживать.

Кроме того, это однозначные функции. Я не знаю, как работает ключевое слово Oracle RETURNING.

Ответ 4

SCOPE_IDENTITY

Ответ 5

Это зависит от вашего контекста вызова.

Если вы вызываете это из кода клиента, вы можете использовать OUTPUT, а затем читать возвращаемое значение.

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr)
OUTPUT Inserted.ColID
VALUES ('Hello World')

Результат:

      ColID
-----------
          1

Если вы завершаете это в хранимой процедуре, использование OUTPUT - это больше. Там вы захотите использовать SCOPE_IDENTITY(), но вы не можете сделать это в одном выражении. Конечно, вы можете поместить несколько операторов в одну строку с символом ';' разделитель, но это не один оператор.

DECLARE @idValue    int
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr) VALUES ('Hello World')

SELECT @idValue = SCOPE_IDENTITY()

Результат: переменная @idValue содержит значение идентификатора. Используйте параметр OUTPUT, чтобы вернуть значение.

Ответ 6

Вы можете использовать OUTPUT INTO, который обладает дополнительными преимуществами для возможности вставки нескольких вставленных идентификаторов.

Ответ 7

INSERT INTO table (foreign_key1, value) VALUES (9, 'text'); SELECT @@IDENTITY;