В SQL Server можно ли получить «идентификатор» записи при выполнении вставки?
-
09-06-2019 - |
Вопрос
В SQL Server 2005 у меня есть поле «id» в таблице, для свойства «Is Identity» установлено значение «Да».Таким образом, когда в этой таблице выполняется вставка, «id» автоматически устанавливается на следующее увеличивающееся целое число.Есть ли простой способ при выполнении вставки получить то, что было установлено для «id», без необходимости выполнять оператор Select сразу после вставки?
дубликат:
Лучший способ узнать идентичность вставленной строки?
Решение
По крайней мере, в .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().
Чтобы сделать это из кода приложения, я обычно инкапсулирую этот процесс в хранимую процедуру, чтобы он по-прежнему выглядел как один запрос к моему приложению.
Я предпочитаю прикреплять триггер к таблице с помощью менеджера предприятия.Таким образом, вам не нужно беспокоиться о написании дополнительных операторов sql в вашем коде.Мои выглядят примерно так:
Создать триггер tblName на dbo.tblname для вставки в качестве выбора new_id = @@ Identity
Затем изнутри вашего кода относитесь к операторам вставки как к операторам выбора. Просто выполните и оцените результаты.столбец «newID» будет содержать идентификатор только что созданной строки.
Вероятно, это лучшее рабочее решение для SQL Server, которое я нашел.Сервер Sql возвращает значение столбца идентификаторов после оператора вставки