Per restituire un singolo valore scalare al chiamante è necessario utilizzare un parametro OUTPUT
, non RETURN
. RETURN
è per codici di errore/stato. Anche il prefisso sp è ridondante e non necessario.
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
Poi chiamarlo:
DECLARE @new_identity INT;
EXEC dbo.AddAsset @Name = 'a', @URL = 'b', @new_identity = @new_identity OUTPUT;
PRINT @new_identity;
EDIT solo l'aggiunta di un disclaimer che non influenzerà il richiedente ha in questo scenario specifico, ma possono aiutare in altri scenari o per i lettori futuri. In SQL Server 2008 R2 e versioni precedenti, esiste un potentially nasty bug con funzioni integrate come SCOPE_IDENTITY
quando viene utilizzato il parallelismo per ricavare i risultati da inserire (si pensi al numero INSERT FROM othertable
). Questo bug (here is the Connect item) è stato risolto in Cumulative Update #5 for SQL Server 2008 R2 SP1, ma finora non è stata trovata alcuna correzione per R2 RTM 2008, 2008 o 2005.
fonte
2012-03-04 18:27:39
Spiacente. Voterò il resto –