2012-03-04 10 views
14

Intenté escribir un procedimiento almacenado que primero inserta un nuevo registro en la tabla y luego devolvía la identificación de este nuevo registro. No estoy seguro si es la forma correcta y la mejor manera de lograr esto.Necesito un procedimiento almacenado que inserta una fila y devuelve el 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

Lo sentimos. Yo votaré el resto. –

Respuesta

27

para devolver un solo valor escalar a la persona que llama debe utilizar un parámetro OUTPUT, no RETURN. RETURN es para códigos de error/estado. Además, el prefijo sp es redundante e innecesario.

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 

Entonces llamarlo:

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

EDITAR sólo añadir una advertencia de que no afectará el autor de la pregunta en este escenario específico, pero puede ayudar en otros escenarios o para los futuros lectores. En SQL Server 2008 R2 y versiones anteriores, hay un potentially nasty bug con funciones integradas como SCOPE_IDENTITY cuando se utiliza el paralelismo para derivar los resultados que se insertarán (piense en INSERT FROM othertable). Este error (here is the Connect item) está arreglado en Cumulative Update #5 for SQL Server 2008 R2 SP1, pero hasta ahora no ha aparecido una corrección para 2008 R2 RTM, 2008 o 2005.

+0

hola, ¿cómo devuelvo el conjunto de múltiples registros que agregué (tengo XML como fuente de entrada)? – godblessstrawberry

Cuestiones relacionadas