Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/10/2011, 15:55
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Generador de claves primarias

En general es recomendado que las primary key sustituas sean del tipo numérico autoincremental, pero si necesitas algo como "CLI001", utilizar una función con un isnull(max()) para obtener el valor tiene dos potenciales problemas:

1. El bajo rendimiento del max() en tablas de gran tamaño.
2. Si no haces un lock para encapsular la llamada a la función f_crearIdAutoincr más el insert del nuevo registro, existe la posibilidad de que, en entornos de mucha concurrencia, dos operaciones simultáneas obtengan el mismo resultado del max(), pero si haces un lock, deberá ser de toda la tabla, cosa que también perjudica el rendimiento en alta concurrencia.

Si tienes tablas pequeñas o la posibilidad de hacer un lock por baja concurrencia, la función f_crearIdAutoincr es suficiente, en caso contrario, tienes la alternativa (aunque no parezca elegante) de crear en cada tabla (TCliente, TProductos, etc) un campo dummy numérico identiy más un trigger con el código para generar el valor de la primary key alfanumérica, por ejemplo:

Código:
create table TCliente 
(id varchar(30),
nombre varchar(30),
direccion varchar(30), 
dummy numeric(8) not null identity)
go

create trigger TCliente_Id on TCliente
for insert
as
begin
update TCliente set id = 'CLI' + cast(dummy as varchar(30))
where dummy = (select dummy from inserted)
end
go

insert into TCliente (nombre, direccion) values ('un nombre','una dirección')
go
Saludos