Quienes trabajaron mas de 5 horas en alguna version del SQLServer, conoceran los campos Identitys. No voy a explicar lo que son, porque si le interesa saber como trabajar con este tipo de campos, ya deberia saber lo que son.
Voy ha hacer un listado de tips que cualquier programador que trabaje con SQL deberia saber al respecto de los campos Identitys:
1) Como resetear el campo: Mucha gente piensa que no es posible resetear el contado de un campo numerico. FALSO. Existen dos formas de hacerlo, una es mediante el TRUNCATE TABLE. Cuando hacemos un TRUNCATE de una tabla, ademas de borrar todo su contenido, reseteamos el valor del campo Identity. Esto es muy obvio, porque un TRUNCATE TABLE no hace nada mas y nada menos que borrar la tabla y volver a crearla.
La segunda opcion (y las que nos interesa) es el comando DBCC CHECKIDENT. Esta instruccion permite setear el valor que queremos del campo Identiy.
Su sintaxis es la siguiente:
DBCC CHECKIDENT NombreTabla,RESEED,NuevoValor
Hay que tener mucho cuidado con el uso de este comando. ya que podemos setear un valor menor al maximo de la tabla actual y crear en algun momento un valor duplicado. Una opcion interesante de este comando es asignar al campo el valor maximo de la tabla, y asi garantizar que no tendremos problemas de registros duplicados, para eso solo hay que poner:
DBCC CHECKIDENT NombreTabla
2) Insertar valores explicitos en un campo Identity:
Cuando se inserta un registro en una tabla con un campo Identity, este se autoincrementa automaticamente y si queremos modificar o insertar este valor manualmente, el SQL nos tira error y nos indica que no es posible.
Sin embargo, algunas veces puede que necesitemos deshabilitar temporalmente el campo Indentity, y poder ingresar un valor explicito a la tabla. Generalmente queremos hacer algo asi cuando hacemos copias o replicaciones de una tabla de una base a otra tabla.
Para esto, tenemos la opcion:
SET IDENTITY_INSERT NombreDeTabla ON.
Con esta opcion, podemos insertar valores en un campo Identity como se fuese un campo mas. Luego, cuando terminamos de insertar valores, hay que volver al estado original del campo Identity. Para eso, lo habilitamos nuevamente con el mismo comando, pero con el parametro OFF.
SET IDENTITY_INSERT NombreDeTabla OFF.
3) Capturar el valor en un INSERT: Muchas veces cuando tenemos una tabla con un campo Identity, al hacer una INSERT, queremos saber cual es el valor que inserto en este campo.
Por alguna razon, lo mas comun en estos casos es usar el @@Indentity, que es una variable global que indica el valor del ultimo campo indentity insertado en cualquier tabla de la base. Esto ultimo es un detalle muy importante. Es habitual si queremos hacer auditoria por ejemplo, poner un trigger que inserte en otra tabla la accion hecha sobre la tabla en la que estamos trabajando. Y como lo mas probable es que esta tabla de auditoria tenga como clave primaria un campo identity, el @@Indentity que siempre usamos para capturar el valor del insert, en vez de devolver el ultimo valor del campo de la tabla que queremos, nos va a devolver el ultimo valor del campo de la tabla de auditoria, que dudo mucho que nos sirva para algo. Para resolver esta situacion, tenemos dos funciones muy utiles: SCOPE_IDENTITY y IDENT_CURRENT.
La funcion SCOPE_IDENTIY nos devuelve el ultimo valor generado dentro de un scope, o sea dentro de un entorno, ya sea un Store Procedure, Funcion o Trigger. En nuestro caso anterior, como el trigger esta fuera del scope, la funcion SCOPE_IDENTIY nos devolveria el valor que queremos.
Por ultimo tenemos otra funcion, IDENT_CURRENT, que donde se le pasa por parametro el nombre de la tabla y nos devuelve el ultimo valor identity generado, sin importar el scope. Creo que esta opcion es la mas clara. Su sintaxis es la siguiente:
SELECT IDENT_CURRENT('NombreTabla')
jueves 22 de marzo de 2007
Inicio
Bueno, probablemente este mensaje solo lo lea yo, mi novia y algun que otro amigo y tal vez algun internauta perdido en este mundo...
Saludos a todos!
Esteban
Saludos a todos!
Esteban
Suscribirse a:
Entradas (Atom)
