Чтобы вернуть одно значение скалярной вызывающему абоненту следует использовать 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 и ранее существует potentially nasty bug со встроенными функциями, такими как SCOPE_IDENTITY
, когда для получения результатов необходимо ввести параллелизм (подумайте INSERT FROM othertable
). Эта ошибка (here is the Connect item) исправлена в Cumulative Update #5 for SQL Server 2008 R2 SP1, но до сих пор исправление не появилось в 2008 R2 RTM, 2008 или 2005.
Извините. Я проголосую за остальных. –