SQL Server - Возвращаемое значение после INSERT

Я пытаюсь получить ключ-значение обратно после INSERT-заявления. Пример: У меня есть таблица с атрибутами name и id. id - это сгенерированное значение.

    INSERT INTO table (name) VALUES('bob');

Теперь я хочу получить id обратно в том же шаге. Как это делается?

Мы используем Microsoft SQL Server 2008.

Комментарии к вопросу (2)
Решение

Нет необходимости в отдельном выберите...

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

Это работает для не-идентичности столбцов (например GUID) тоже

Комментарии (8)

Используйте SCOPE_IDENTITY() для получения нового значения ID

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

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

Комментарии (4)
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

Самая безопасная ставка, так как есть известная проблема с пунктом вывода конфликта на таблицы с триггерами. Делает это достаточно ненадежный, поскольку даже если ваш стол не'В настоящее время Т есть какие-либо триггеры - кто-то добавляет одну линию сломать ваше приложение. Время вроде бомбы поведения.

См. В статье MSDN для более глубокого объяснения:

http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx

Комментарии (5)

Рамках субъект выполняет что-то похожее на ГБН'ы ответа:

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');

SELECT t.[CustomerID]
FROM @generated_keys AS g 
   JOIN dbo.Customers AS t 
   ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0

Выходные результаты сохраняются во временной таблице переменных, а потом выбираться обратно клиенту. Должны быть в курсе попалась:

вставки могут составлять более чем одну строку, так что переменная может содержать более одной строки, так что вы можете быть возвращено более одного идентификатор

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

Но, что's что ФВ делает.

В SQL Server 2008 или новее только. Если это's 2005 года, затем вы'вновь повезло.

Комментарии (0)

`Функция@@Identity-это системная функция, которая возвращает последнее значение идентификатора, вставленное.

Комментарии (1)

Вы можете использовать scope_identity() для выбора идентификатора строки, которую вы только что вставили в переменную, а затем просто выбрать любые столбцы из этой таблицы, где id = идентификатору, который вы получили из scope_identity().

Смотрите здесь информацию MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx

Комментарии (0)

Лучшим и наиболее надежным решением является использование функции scope_identity()`.

Просто вы должны сделать сферу личности после каждого Insert и сохранить его в переменной, так можно назвать две вставки в той же области.

функция ident_current и `функция@@Identity может быть они работают, но они не являются безопасными области. Вы можете иметь проблемы в большом приложении

  declare @duplicataId int
  select @duplicataId =   (SELECT SCOPE_IDENTITY())

Более подробно здесь Майкрософт документации

Комментарии (2)

Есть много способов, чтобы выйти после вставки

при вставке данных в таблицу, вы можете использовать предложение output возвращает копию данных, которые были вставлены в таблицу. В В предложении output принимает две основные формы: выход и вывод. Используйте форма выпуска Если вы хотите возврата данных вызывающему приложению. использовать выходные данные в форме, если вы хотите вернуть данные в таблице или переменная таблица.

DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));

INSERT INTO tableName
(
  NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
   'test',...
)

Функция ident_current: он возвращает последний стиль, созданный для конкретной таблицы или представления в любой сессии.

SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]

Функция scope_identity: он возвращает последний тож из той же сессии, и той же области. Объем хранимых процедур/триггеров и т. д.

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  

@@Личность: он возвращает последний тож из той же сессии.

SELECT @@IDENTITY AS [@@IDENTITY];
Комментарии (0)

Это, как я использую выход вставить, при вставке в таблицу, которая использует ID в столбец идентификаторов в SQL сервере:

'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
Комментарии (0)

Вы можете добавить Select для вашего оператора Insert. Целое число Мьинт = Вставить в таблицу table1 (имени) значения('Фред'); выберите функции scope_identity(); Это вернет значение личности при выполнении скалер.

Комментарии (0)

Порядок параметров в строке подключения-это иногда важно. Поставщик параметра'ы местонахождение можно разбить записей курсор после добавления строки. Мы видели такое поведение с поставщика sqloledb.

После добавления строки, поля строк не доступен, если поставщик указан как первый параметр в строке подключения. Когда поставщик находится в любом месте в строке подключения, кроме как первый параметр, недавно вставленные поля строк не доступен. Когда мы переехали поставщика первого параметра, строки волшебным образом появились поля.

Комментарии (4)

Это может быть немного старомодно, но есть много людей, использующих старые версии PHP, до 5.5 если быть более точным. Более подробную информацию можно найти на http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();
Комментарии (0)

После выполнения вставки в таблицу со столбцом identity вы можете сослаться на @@IDENTITY, чтобы получить значение: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx

Комментарии (2)