Estoy tratando de recuperar el valor-clave después de una instrucción INSERT. Ejemplo: Tengo una tabla con el nombre y la identificación de los atributos. id es un valor generado.
INSERT INTO table (name) VALUES('bob');
Ahora quiero recuperar la identificación en el mismo paso. ¿Cómo se hace esto?
Estamos usando Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbic
fuente
fuente
Respuestas:
No es necesario un SELECT por separado ...
Esto también funciona para columnas sin IDENTIDAD (como GUID)
fuente
Use
SCOPE_IDENTITY()
para obtener el nuevo valor de IDhttp://msdn.microsoft.com/en-us/library/ms190315.aspx
fuente
id
es identidadid
, entonces sí.Es la apuesta más segura ya que existe un problema conocido con el conflicto de la cláusula OUTPUT en tablas con activadores. Hace que esto sea poco confiable, ya que incluso si su tabla actualmente no tiene ningún desencadenante: alguien que agregue uno en la línea interrumpirá su aplicación. Tipo de comportamiento de bomba de tiempo.
Consulte el artículo de msdn para obtener una explicación más profunda:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
fuente
Entity Framework realiza algo similar a la respuesta de gbn:
Los resultados de salida se almacenan en una variable de tabla temporal y luego se vuelven a seleccionar al cliente. Tienes que estar al tanto del problema:
No tengo idea de por qué EF uniría internamente la tabla efímera a la tabla real (en qué circunstancias los dos no coincidirían).
Pero eso es lo que hace EF.
SQL Server 2008 o más reciente solamente. Si es 2005, entonces no tienes suerte.
fuente
Customer
registro insertado , ya que puede haber otra lógica del lado DB que lo afecte, por ejemplo,DEFAULT
en algunas columnas, disparadores en la tabla, etc. EF actualiza el entidad (objeto) que utilizó para la inserción, por lo que el lado del cliente obtiene el objeto del cliente con la ID y todo lo demás que representa el estado actual de la fila.@@IDENTITY
Es una función del sistema que devuelve el último valor de identidad insertado.fuente
Hay muchas formas de salir después de insertar
IDENT_CURRENT : devuelve la última identidad creada para una tabla o vista en particular en cualquier sesión.
SCOPE_IDENTITY : devuelve la última identidad de una misma sesión y el mismo alcance. Un ámbito es un procedimiento almacenado / disparador, etc.
@@ IDENTITY : Devuelve la última identidad de la misma sesión.
fuente
out put
parabulk insert
y el inserto porselect statement
. gracias su sugerenciaLa mejor y más segura solución es usar
SCOPE_IDENTITY()
.Solo tiene que obtener la identidad del alcance después de cada inserción y guardarla en una variable porque puede llamar a dos inserciones en el mismo alcance.
ident_current
y@@identity
puede ser que funcionen pero no tienen un alcance seguro. Puedes tener problemas en una aplicación grandeMás detalles aquí. Documentos de Microsoft
fuente
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
cláusula es una solución mejor y más pura :)Puedes usar
scope_identity()
para seleccionar la ID de la fila que acaba de insertar en una variable y luego seleccionar las columnas que desee de esa tabla donde id = la identidad que obtuvoscope_identity()
Consulte aquí la información de MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
fuente
Hay varias formas de obtener la última ID insertada después del comando de inserción.
@@IDENTITY
: Devuelve el último valor de identidad generado en una conexión en la sesión actual, independientemente de la tabla y el alcance de la declaración que produjo el valorSCOPE_IDENTITY()
: Devuelve el último valor de identidad generado por la instrucción de inserción en el ámbito actual en la conexión actual, independientemente de la tabla.IDENT_CURRENT(‘TABLENAME’)
: Devuelve el último valor de identidad generado en la tabla especificada, independientemente de cualquier conexión, sesión o alcance. IDENT_CURRENT no está limitado por el alcance y la sesión; se limita a una tabla especificada.Ahora parece más difícil decidir cuál será la coincidencia exacta para mi requerimiento.
Principalmente prefiero SCOPE_IDENTITY ().
Si usa select SCOPE_IDENTITY () junto con TableName en la instrucción de inserción, obtendrá el resultado exacto según sus expectativas.
Fuente: CodoBee
fuente
Así es como uso OUTPUT INSERTED, cuando inserto en una tabla que usa ID como columna de identidad en SQL Server:
fuente
Puede agregar una declaración de selección a su declaración de inserción. Entero myInt = Insertar en los valores de tabla1 (FName) ('Fred'); Seleccione Scope_Identity (); Esto devolverá un valor de la identidad cuando se ejecute el escalador.
fuente
Después de insertar en una tabla con una columna de identidad, puede hacer referencia a @@ IDENTITY para obtener el valor: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
fuente
* El orden de los parámetros en la cadena de conexión a veces es importante. * La ubicación del parámetro Proveedor puede romper el cursor del conjunto de registros después de agregar una fila. Vimos este comportamiento con el proveedor SQLOLEDB.
Después de agregar una fila, los campos de la fila no están disponibles, A MENOS que el proveedor se especifique como el primer parámetro en la cadena de conexión. Cuando el proveedor está en cualquier parte de la cadena de conexión, excepto como primer parámetro, los campos de fila recién insertados no están disponibles. Cuando movimos el Proveedor al primer parámetro, los campos de fila aparecieron mágicamente.
fuente