Вам нужна хранимая процедура, которая вставляет строку и возвращает идентификатор

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

ALTER PROCEDURE dbo.spAddAsset
(
@Name VARCHAR(500),
@URL VARCHAR(2000)
)
AS
BEGIN
Set NOCOUNT on;

Insert Into Assets (Name, URL) Values (@Name, @URL)

Declare @new_identity int;

SELECT @new_identity = SCOPE_IDENTITY()

return @new_identity;
END

Ответы

Ответ 1

Чтобы вернуть одиночное скалярное значение вызывающему, вы должны использовать параметр OUTPUT, а не RETURN. RETURN для кодов ошибок/состояний. Также префикс sp является избыточным и ненужным.

CREATE PROCEDURE dbo.AddAsset
  @Name VARCHAR(500),
  @URL  VARCHAR(2000),
  @new_identity INT = NULL OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT dbo.Assets(Name, URL) SELECT @Name, @URL;
    SET @new_identity = SCOPE_IDENTITY();
END
GO

Затем назовем это:

DECLARE @new_identity INT;
EXEC dbo.AddAsset @Name = 'a', @URL = 'b', @new_identity = @new_identity OUTPUT;
PRINT @new_identity;

EDIT просто добавляет отказ от ответственности, который не повлияет на вопросника в этом конкретном сценарии, но может помочь в других сценариях или для будущих читателей. В SQL Server 2008 R2 и ранее существует потенциально неприятная ошибка со встроенными функциями, такими как SCOPE_IDENTITY, когда parallelism используется для получения результатов вставлен (подумайте INSERT FROM othertable). Эта ошибка (вот элемент Connect) исправлена ​​в накопительном обновлении № 5 для SQL Server 2008 R2 с пакетом обновления 1 (SP1), но до сих пор исправление не появилось в RTM 2008 R2, 2008 или 2005.