В SQL Server можно ли получить «идентификатор» записи при выполнении вставки? - PullRequest
12 голосов
/ 10 сентября 2008

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

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

Ответы [ 7 ]

32 голосов
/ 11 сентября 2008

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

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

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

15 голосов
/ 11 сентября 2008

Если вы вставляете несколько строк, использование предложений 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  
3 голосов
/ 11 сентября 2008

Scope_identity () является предпочтительным способом, см .: 6 различных способов получить текущее значение идентификатора

2 голосов
/ 11 сентября 2008

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();
1 голос
/ 11 сентября 2008

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

Создать триггер tblName На dbo.tblName Для вставки Как выберите новый_идентификатор = @@ IDENTITY

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

1 голос
/ 10 сентября 2008

Вы должны выбрать функцию scope_identity ().

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

0 голосов
/ 02 января 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...