Ответ 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.