2012-03-04 1 views
14

Ho provato a scrivere una stored procedure che prima inserisce un nuovo record nella tabella e quindi ha restituito l'id di questo nuovo record. Non sono sicuro se sia il modo corretto e il modo migliore per raggiungere questo obiettivo.È necessaria una stored procedure che inserisca una riga e restituisca l'ID

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 
+0

Spiacente. Voterò il resto –

risposta

27

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.

+0

ciao, come posso restituire il set di più record che ho aggiunto (ho XML come sorgente di input)? – godblessstrawberry