Как вернуть новое значение столбца IDENTITY из оператора SELECT SQLServer? - PullRequest
11 голосов
/ 10 июня 2009

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

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 10 июня 2009

Как правило, это невозможно сделать одним оператором.

Но 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

9 голосов
/ 10 июня 2009
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')
4 голосов
/ 10 июня 2009

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

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

2 голосов
/ 11 июня 2009

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

Если вы вызываете это из клиентского кода, вы можете использовать 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 для возврата значения.

2 голосов
/ 10 июня 2009

SCOPE_IDENTITY

0 голосов
/ 10 июня 2009

INSERT INTO таблица (foreign_key1, значение) VALUES (9, 'текст'); SELECT @@ IDENTITY;

0 голосов
/ 10 июня 2009

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

...