2008-09-10 50 views
12

En SQL Server 2005 tengo un campo "id" en una tabla que tiene la propiedad "Is Identity" establecida en 'Sí'. Por lo tanto, cuando se ejecuta una inserción en esa tabla, el "id" se establece automáticamente en el siguiente entero creciente. ¿Hay una manera fácil cuando se ejecuta el Insertar para obtener lo que se estableció el "id" sin tener que hacer una instrucción Seleccionar justo después del Insertar?En SQL Server, ¿es posible obtener "id" de un registro cuando se ejecuta Insertar?

duplicado de:
Best way to get identity of inserted row?

Respuesta

32

En .Net al menos, puede enviar varias consultas al servidor de una sola vez. Lo hago en mi aplicación:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()"; 
int id = (int)command.ExecuteScalar(); 

Funciona como un encanto.

+3

Esta solución es buena, cuando sólo se trata de cambios de una sola hilera. Para una buena solución de actualización masiva, vea la respuesta de kamajo. – CodeWarrior

+1

Para aquellos que buscan cómo hacerlo con MySQL: simplemente reemplace SCOPE_IDENTITY con LAST_INSERT_ID. O simplemente use el parámetro LastInsertedId en MySqlCommand; –

+0

Aparece un error que arroja el valor de retorno de ExecuteScalar() directamente a un int. Funciona bien cuando lo echo a un decimal. –

1

tiene que seleccionar la función SCOPE_IDENTITY().

Para hacer esto desde el código de la aplicación, normalmente encapsulado este proceso en un procedimiento almacenado por lo que todavía parece una consulta a mi aplicación.

2

SCOPE_IDENTITY(); es tu mejor apuesta. Y si está usando .NET simplemente pase un parámetro nuestro y verifique el valor después de ejecutar el procedimiento.

CREATE PROCEDURE [dbo].[InsertProducts] 
    @id    INT    = NULL OUT, 
    @name   VARCHAR(150) = NULL, 
    @desc   VARCHAR(250) = NULL 

AS 

    INSERT INTO dbo.Products 
     (Name, 
     Description) 
    VALUES 
     (@name, 
     @desc) 

    SET @id = SCOPE_IDENTITY(); 
14

Si vas a insertar varias filas, el uso de la cláusula OUTPUT y INSERTED.columnname en la cuenta de insert es una forma sencilla de obtener todos los identificadores en una tabla temporal.

DECLARE @MyTableVar table(ID int, 
           Name varchar(50), 
           ModifiedDate datetime); 
INSERT MyTable 
     OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar 
SELECT someName, GetDate() from SomeTable 
+0

¡Me gusta esto! Gracias por el consejo. – CodeWarrior

+0

BTW, no estoy seguro de si es específico de la versión (ahora es 2012 y estoy en SQL 10.0.1600), pero no tiene que pasar por una tabla temporal para esto; puede simplemente generar resultados directamente. También me gusta que esto también funcione para los campos GUID, si se usan como PK ... no es que yo defienda que se haga tanto, pero funciona. –

1

Tiendo a preferir asociar un disparador a la tabla usando el administrador de empresa. De esta forma, no tendrá que preocuparse por escribir enunciados SQL adicionales en su código. Mina de ser algo como esto:

Crear activador tblName En dbo.tblName Para Insertar Como seleccione NEW_ID = @@ IDENTITY

Entonces, desde el interior de su código, trate a sus instrucciones de inserción como seleccione Sólo statements- ejecutar y evaluar los resultados. la columna "newID" contendrá la identidad de la fila que acaba de crear.

Cuestiones relacionadas