¿Cómo puedo recuperar el ID autogenerado para un nuevo registro que acabo de insertar? (mediante ASP clásico y MSSQL 2005)obtener nuevo ID de registro SQL
Respuesta
Gracias a todos los que han sugerido SELECCIONAR SCOPE_IDENTITY(). Yo era capaz de crear un procedimiento almacenado:
USE [dbname]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spInsert]
(
@Nn varchar(30)
)
AS
BEGIN TRANSACTION InsertRecord
INSERT INTO A (Nn)
VALUES (@Nn)
SELECT NewID = SCOPE_IDENTITY() -- returns the new record ID of this transaction
COMMIT TRANSACTION InsertRecord
y llamar al procedimiento almacenado utilizando VB:
Dim strNn '<- var to be passed'
Set cn = Server.CreateObject("ADODB.Connection")
connectString = "DSN"
cn.Open connectString, "user", "PW0rd"
Set rs = Server.CreateObject("ADODB.Recordset")
set rs = cn.Execute("EXEC [dbname].[dbo].[A] @Nn=" & strNn)
'return the value'
resultID = rs(0)
ahora puedo usar resultid en cualquier momento me refiero a la ID de nueva creación.
SELECT SCOPE_IDENTITY()
usando @@ identidad puede tener resultados inesperados, así que tenga cuidado cómo se utiliza esa. Los activadores que insertan registros en otras tablas harán que cambie el valor de @@ IDENTITY, donde SCOPE_IDENTITY() le dará la última identidad solo de su alcance actual.
He aquí una muestra que va a mostrar la diferencia entre @@ IDENTITY y SCOPE_INSERT() y cómo pueden devolver valores diferentes ..
use tempdb
go
create table table1
(ID int identity)
go
create table table2
(ID int identity(100, 1))
go
create trigger temptrig
on table1
for insert
as
begin
insert table2
default values;
end
go
insert table1
default values;
select SCOPE_IDENTITY(),
@@IDENTITY
Otra opción que nadie ha discutido aquí es el uso de la cláusula OUTPUT eso es en SQL 2005. En este caso, solo tendría que agregar la cláusula de salida a su inserción, y luego capturar ese conjunto de registros de su código. Esto funciona bien cuando la inserción de múltiples registros en lugar de sólo 1 ...
use tempdb
go
create table table1
(ID int identity)
go
insert table1
output inserted.ID
default values;
--OR...
insert table1
output inserted.$identity
default values;
SELECT @@ IDENTITY por lo general funciona, pero podría volver la identidad de un registro insertado a causa de un disparo o algo, y no el original.
SELECCIONAR SCOPE_IDENTITY es lo que recomendaría. Devuelve valores insertados solo dentro del alcance actual.
También hay un "IDENT_CURRENT (nombre de tabla)" que devuelve la última identidad insertada para una tabla específica.
SELECCIONE @@ Identity o SELECT SCOPE_IDENTITY() ambos funcionan sin embargo La selección de SCOPE_Identity() es más segura porque devuelve el último ID generado automáticamente dentro de su ámbito actual. Entonces, por ejemplo, supongamos que tenemos una tabla llamada ScopeIDTable y en esta tabla tenemos un disparador. Este disparador se insertará en un registro en TriggerIdTable, ambas tablas tienen una columna de incremento automático.
Si usa SELECT @@ Identity obtendrá el último incremento automático en esa sesión que sería el ID generado desde el desencadenador (TriggerIdTable).
Si usa SELECT SCOPE_IDENTITY() obtendrá la identificación de su ScopeIdTable.
Hay tres formas de obtener la última identidad en sql.
Ellos ya fueron mencionados por otros, pero está completo:
- @@ IDENTITY - también puede devolver los identificadores creados en otros objetos en el mismo ámbito (piensan disparadores)
- IDENT_CURRENT - limitado a una tabla, pero no para su alcance, por lo que puede dar malos resultados para las tablas ocupadas
- Scope_Idenity() - Limitado al alcance de la solicitud.Utilice este 99% del tiempo
Además, hay tres maneras de tomar ese ID y devolverlo a su código de cliente:
Usar un parámetro de salida en un procedimiento almacenado
INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); SELECT @OutputParameterName = Scope_Identity();
Utilice un valor de retorno.
INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); Return Scope_Identity();
Seleccione la identificación en un conjunto de resultados. Por ejemplo, la instrucción SQL sería algo como esto:
Dim ResultID As Integer Dim strSQL As String strSQL = "INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); SELECT Scope_Identity();" rsResults.Open strSQL, oConn ResultID = rsResults("ID")
Desafortunadamente (o afortunadamente, desde mi punto de vista) mi ASP clásico que ha ido demasiado lejos para mostrar ejemplos de los dos primeros de código de cliente .
ejecutar la consulta
select scope_identity()
utilizando la misma conexión de base de datos, antes de hacer nada con él. El resultado es, como probablemente espera, un conjunto de registros que contiene una sola fila que tiene un solo campo. Se puede acceder al campo utilizando el índice 0, o puede darle un nombre, si lo prefiere que:
select scope_identity() as lastId
Cuando múltiples registros deben insertarse a la vez de un modo basado en conjuntos, se puede obtener más interesante.
Algunas veces utilicé GUID generados en el cliente (pero para ASP clásico probablemente necesitarías usar una utilidad para generar los valores) o, más a menudo, una restricción NEWSQUENTIALID() en la columna de clave GUID al final del servidor.
No soy consciente de que a todos les gustan los GIUDS, por algunos motivos bastante válidos (su tamaño y cómo afecta la indexación/paginación de uno).
http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2
Siempre me he preguntado por qué uno va a querer utilizar
@@identity
desde
select scope_identity()
, obviamente, es la más ahorrar manera de lograr lo que Scot está pidiendo.
- 1. Obtener ID de registro cuando mysql devuelve un error duplicado
- 2. ASP.NET MVC Obtener ID del último registro agregado
- 3. En SQL Server, ¿es posible obtener "id" de un registro cuando se ejecuta Insertar?
- 4. Obtener el ID de un nuevo registro insertado en una base de datos de la Uri regresado
- 5. Obtener ID del último registro insertado en Oracle db
- 6. asmack XMPP nuevo registro de usuario
- 7. SqlAlchemy: obteniendo el id del último registro insertado
- 8. Cómo obtener el último registro por grupo en SQL
- 9. ¿Cómo puedo obtener el valor de la clave principal cuando inserto un nuevo registro?
- 10. DataMapper: Crear nuevo registro o actualizar existente
- 11. Obteniendo la ID del registro recién insertado?
- 12. ¿Cómo obtener la identificación del nuevo registro insertado usando Excel VBA?
- 13. jQuery .clone .insertDespués con un nuevo ID
- 14. Obtenga Id usando LINQ to SQL
- 15. ¿Cómo obtengo el texto del comando SQL cuando inserto un nuevo registro con Linq?
- 16. Obtener ID recientemente generado (es decir, scopeIdentity) en Entity FrameWork
- 17. vb.net sql último ID insertado
- 18. cómo obtener el segundo registro en linq a sql
- 19. Recuperar el ID de un registro insertado: SERVIDOR PHP y MS SQL
- 20. Obtener conexión PDO ID
- 21. obtener asana proyecto id
- 22. Guardar nuevo objeto con Hibernate usando el ID suministrado
- 23. obtener jquery `$ (this)` id
- 24. Obtener ID de dom-elemento
- 25. SQL NO EN [lista de ID] (rendimiento)
- 26. Obtener Content-ID de la imagen adjunta al redactar un nuevo correo electrónico en iOS
- 27. ¿Cómo obtener el ID de inserción de este ADODB.Recordset?
- 28. Duplicate LINQ to SQL entidad/registro?
- 29. Factory Girl: ¿Cómo asociar un registro a otro registro sin crear un nuevo registro?
- 30. Consulta SQL para devolver solo 1 registro por ID de grupo
agradece a todos los que sugirieron SELECT SCOPE_IDENTITY().Yo era capaz de crear un procedimiento almacenado:. ANSI_NULLS SET en GO QUOTED_IDENTIFIER SET EN ir ALTER PROCEDIMIENTO [dbo] [giros] (varchar @N (30) AS BEGIN TRANSACTION Ins INSERT INTO A (n) VALORES (@N) SELECT NewID = SCOPE_IDENTITY() – Keith
'usando VB que se llama el SP:
Set cn = Server.CreateObject ("ADODB.Connection") myConnectionString = "DSN" cn.Open myConnectionString, "usuario", "PW0rd" Establecer rs = Server.CreateObject ("ADODB.Recordset") establecer rs = cn.Execute ("EXEC [DB]. [dbo]. [A] @ Str =" & str)
'devolver el valor:
resultID = rs (0) – Keith