В SQL Server можно ли получить " id " записи при выполнении Insert?

в SQL Server 2005 у меня есть поле "id "в таблице, в которой свойство" is Identity "имеет значение "Yes". Таким образом, когда вставка выполняется в этой таблице, "id" автоматически устанавливается на следующее инкрементное целое число. Есть ли простой способ, когда вставка выполняется, чтобы получить то, что" id " был установлен без необходимости делать оператор Select сразу после вставки?

копия:
лучший способ получить идентификатор вставленной строки?

7 ответов


в .Net, по крайней мере, вы можете отправить несколько запросов на сервер за один раз. Я делаю это в своем приложении:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();

работает как шарм.


если вы вставляете несколько строк, используйте OUTPUT и INSERTED.columnname положения о insert оператор-это простой способ получить все идентификаторы во временную таблицу.

DECLARE @MyTableVar table( ID int,  
                               Name varchar(50),  
                               ModifiedDate datetime);  
INSERT MyTable  
        OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar  
SELECT someName, GetDate() from SomeTable  

функция scope_identity() является предпочтительным способом, см.: 6 Различных Способов Получить Текущее Значение Идентификатора


SCOPE_IDENTITY (); ваш лучший выбор. И если вы используете .NET, просто передайте наш параметр и проверьте значение после выполнения процедуры.

CREATE PROCEDURE [dbo].[InsertProducts]
    @id             INT             = NULL OUT,
    @name           VARCHAR(150)    = NULL,
    @desc           VARCHAR(250)    = NULL

AS

    INSERT INTO dbo.Products
       (Name,
        Description)
    VALUES
       (@name,
        @desc)

    SET @id = SCOPE_IDENTITY();

выберите функции scope_identity ().

чтобы сделать это из кода приложения, я обычно инкапсулирую этот процесс в хранимую процедуру, чтобы он все еще выглядел как один запрос к моему приложению.


Я предпочитаю прикреплять триггер к таблице с помощью enterprise manager. Таким образом, вам не нужно беспокоиться о написании дополнительных операторов sql в вашем коде. Мои выглядят примерно так:

создать триггер tblName На ДБО.tblName для вставок Как выберите new_id = @@IDENTITY

затем, из вашего кода, обработайте свои инструкции insert как Select - просто выполните и оцените результаты. столбец "newID" будет содержать идентификатор строки ты только что создал.


Это, вероятно, лучшее рабочее решение, которое я нашел для SQL Server.. Sql Server возвращает значение столбца identity после инструкции insert