ultimo scope_identity reiniciar obtener insertado ident_current ejemplo sql-server tsql identity

sql-server - reiniciar - scope_identity sql server ejemplo



¿Cómo se puede saber qué próxima columna de identidad será? (6)

¿Hay una consulta tsql para indicar qué valor de la columna de identidad del servidor SQL espera usar para la siguiente fila?

Editado para agregar:

Eliminé y recreé una tabla con

[personID] [int] IDENTITY(1,1) NOT NULL

como parte de mi comando CREATE TABLE. También intenté resembrar columnas de identidad al eliminar toda la información en esa tabla y eso no siempre ha funcionado. Me hizo preguntarme si había una forma de ver qué SQL esperaba usar para su próximo número de columna de identidad.


Dado que siembras desde 1 e incrementas por 1 (IDENTIDAD (1,1)), me pregunto si puedes crear un procedimiento donde puedes establecer una variable como "Seleccionar @@ IDENTIDAD + 1" o algo así.


Probablemente desee utilizar SCOPE_IDENTITY not @@ IDENTITY para restringirlo al valor de identidad en el alcance actual. Esto evita que los triggers inserten nuevos valores de identidad en otras tablas y no en la tabla en la que acaba de insertar.

Pero puedes calcular cuál es el siguiente valor de identidad

SELECT IDENT_CURRENT(''mytable'') + IDENT_INCR(''mytable'') FROM mytable

El problema es que no se garantiza que ese sea el valor. Tendría que tener un candado de tal manera que otras inserciones sean denegadas en la mesa cuando se ejecuta para garantizar que el valor sea preciso. Además, después de que te quedas sin enteros de 32 bits, no sé cuál es la lógica. No sé si se da vuelta o falla.

Editar: Acabo de probar esto (ver más abajo para SQL) y no devuelve el valor correcto cuando no hay datos. Y resiembra con DBCC CHECKIDENT (''tablename'', RESEED, 200) resultó en el siguiente valor siendo 201 no 200.

CREATE TABLE willtest (myid integer IDENTITY(1,1), myvalue varchar(255)) SELECT IDENT_CURRENT(''willtest'') + IDENT_INCR(''willtest'') INSERT INTO willtest (myvalue) VALUES (''1'') INSERT INTO willtest (myvalue) VALUES (''2'') INSERT INTO willtest (myvalue) VALUES (''3'') INSERT INTO willtest (myvalue) VALUES (''4'') INSERT INTO willtest (myvalue) VALUES (''5'') INSERT INTO willtest (myvalue) VALUES (''6'') INSERT INTO willtest (myvalue) VALUES (''7'') INSERT INTO willtest (myvalue) VALUES (''8'') SELECT IDENT_CURRENT(''willtest'') + IDENT_INCR(''willtest'') DBCC CHECKIDENT (''willtest'', RESEED, 200) SELECT IDENT_CURRENT(''willtest'') + IDENT_INCR(''willtest'') INSERT INTO willtest (myvalue) VALUES (''200'') INSERT INTO willtest (myvalue) VALUES (''201'') INSERT INTO willtest (myvalue) VALUES (''202'') INSERT INTO willtest (myvalue) VALUES (''203'') INSERT INTO willtest (myvalue) VALUES (''204'') INSERT INTO willtest (myvalue) VALUES (''205'') INSERT INTO willtest (myvalue) VALUES (''206'') INSERT INTO willtest (myvalue) VALUES (''207'') SELECT IDENT_CURRENT(''willtest'') + IDENT_INCR(''willtest'') SELECT * FROM willtest DROP TABLE willtest


Use columnas GUID para sus claves principales. A menos que tenga miles de millones de registros y miles de solicitudes por segundo, probablemente no notará la diferencia en el rendimiento. Pero a menos que le guste pasar demasiado tiempo lidiando con problemas estúpidos como este, notará la diferencia en su nivel de estrés y esperanza de vida.


No, no hay ninguna forma garantizada (aunque ciertamente puede averiguar cuál será el próximo valor, otro comando podría ir y usarlo antes de poder usarlo). El único valor garantizado que puede recuperar es el valor de identidad insertado previamente a través de SCOPE_IDENTITY() (que devolverá el valor de identidad último generado para el alcance actual).

Es cuestionable el propósito por el cual uno necesitaría saber el valor antes (cuando se usa una columna de identidad sembrada automáticamente).

Si necesita saber el valor antes, entonces le recomiendo que genere los identificadores. Puede hacer esto con una tabla de ids codificada en el nombre de la tabla o, si tiene inquietudes de escalabilidad (y está utilizando transacciones), puede tener una tabla de id para cada tabla que necesita un id que debe tener insertado el id. y posteriormente incrementado).

O bien, podría usar un GUID, y podría generarlos fácilmente en el lado del cliente antes de enviarlo a su base de datos.


SELECT IDENT_CURRENT(''mytable'') + IDENT_INCR(''mytable'') FROM mytable


Esta pieza de sql le dará el siguiente valor de columna de identidad (probablemente haya muchas razones para no repetir este fragmento en el código de producción)

declare @nextid int; declare @previousid int; begin tran insert into dbo.TestTable (Col1) values (''11''); select @nextid = SCOPE_IDENTITY(); rollback tran select @previousid = @nextid -1 DBCC CHECKIDENT(''dbo.TestTable'', RESEED, @previousid); select @nextid

esta pregunta de proporciona información adicional: sql-identity-autonumber-is-increment-even-with-a-transaction-rollback