2010-07-26 14 views
10

Imagínese una mesa que tiene este aspecto:Volver NEWSEQUENTIALID() como un parámetro de salida

CREATE TABLE [dbo].[test](
    [id] [uniqueidentifier] NULL, 
    [name] [varchar](50) NULL 
) 

GO 

ALTER TABLE [dbo].[test] ADD CONSTRAINT [DF_test_id] DEFAULT (newsequentialid()) FOR [id] 
GO 

Con un procedimiento INSERT almacenado que se parece a esto:

CREATE PROCEDURE [Insert_test] 
    @name as varchar(50), 
    @id as uniqueidentifier OUTPUT 
AS 
BEGIN 
    INSERT INTO test(
     name 
    ) 
    VALUES(
     @name 
    ) 
END 

¿Cuál es la mejor manera de conseguir el GUID que acaba de insertarse y devolverlo como un parámetro de salida?

Respuesta

10

uso de la cláusula de salida de la sentencia Insert.

CREATE PROCEDURE [Insert_test] 
    @name as varchar(50), 
    @id as uniqueidentifier OUTPUT 
AS 
BEGIN 
    declare @returnid table (id uniqueidentifier) 

    INSERT INTO test(
     name 
    ) 
    output inserted.id into @returnid 
    VALUES(
     @name 
    ) 

    select @id = r.id from @returnid r 
END 
GO 

/* Test the Procedure */ 
declare @myid uniqueidentifier 
exec insert_test 'dummy', @myid output 
select @myid 
+0

Esto era exactamente lo que necesitaba. –

0

Trate

SELECT @ID = ID FROM Test WHERE Name = @Name 

(si el nombre tiene una restricción de unicidad)

+2

"(si el nombre tiene una restricción única)" No hay nada en el OP que nos haga pensar que es una suposición válida y es innecesariamente restrictiva. –

Cuestiones relacionadas