SQL - транзакции получают значение автоинкремента внутри транзакции - PullRequest
0 голосов
/ 10 марта 2019

У меня есть 2 таблицы, первая таблица содержит второстепенные сведения об элементе, а вторая таблица содержит остальную информацию.

BEGIN TRANSACTION;

INSERT INTO Items (Name, CategoryId) 
VALUES ('My Tv', 5);

INSERT INTO CharsToItem (ItemId, Value) 
VALUES ((SELECT Id FROM Items WHERE Id = @@Identity;), '65 Inch');

INSERT INTO CharsToItem (ItemId, Value) 
VALUES ((SELECT Id FROM Items WHERE Id = @@Identity;), '3840x2160');

COMMIT;

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

Есть ли способ сохранить Id в select и использовать его несколько раз?

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

После первой вставки в таблицу CharsToItem, @@Identity возвращает идентификатор вновь вставленного элемента в CharsToItem.

Поэтому после вставки в Items сохраните идентификатор в переменной

DECLARE @itemId int -- Variable to store the last ItemId.

BEGIN TRANSACTION;

INSERT INTO Items (Name, CategoryId) VALUES ('My Tv', 5);
SET @itemId = SCOPE_IDENTITY();  -- Store the new ItemId

INSERT INTO CharsToItem (ItemId, Value) VALUES (@itemId, '65 Inch');
INSERT INTO CharsToItem (ItemId, Value) VALUES (@itemId, '3840x2160');

COMMIT;

Обратите внимание, что вам не нужно ВЫБРАТЬ последний идентификатор из чего-либо, @@IDENTITY или SCOPE_IDENTITY() уже возвращает этот последний идентификатор.

Обратите внимание, что SCOPE_IDENTITY()безопаснее, чем @@IDENTITY, так как @@IDENTITY может вернуть идентификатор, созданный триггером, например.

См. этот ответ на этот вопрос SO: scope_identity vs ident_current .

1 голос
/ 10 марта 2019
DECLARE @ItemId int;

BEGIN TRANSACTION;

INSERT INTO Items (Name, CategoryId) VALUES ('My Tv', 5);

SET @ItemId = scope_identity();

INSERT INTO CharsToItem (ItemId, Value) VALUES (@ItemId, '65 Inch');
INSERT INTO CharsToItem (ItemId, Value) VALUES (@ItemId, '3840x2160');

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