2009-02-26 22 views
9

¿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

+0

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

+0

'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

Respuesta

0

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.

25
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; 
9

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.

3

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.

9

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 .

1

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 
0

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

1

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.

Cuestiones relacionadas