Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Generador de claves primarias

Estas en el tema de Generador de claves primarias en el foro de SQL Server en Foros del Web. Bueno lo que tenia pensado es hacer una función que me genere Claves Primarias para una determinada tabla (@NombreTabla). la clave primaria tiene que generar ...
  #1 (permalink)  
Antiguo 02/10/2011, 19:53
 
Fecha de Ingreso: agosto-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Generador de claves primarias

Bueno lo que tenia pensado es hacer una función que me genere Claves Primarias para una determinada tabla (@NombreTabla).
la clave primaria tiene que generar con parte del nombre de la tabla, por ejemplo para una tabla
- TCliente: ------> clave primaria seria: CLI02101
- TProducto ------>clave primaria seria: PRO0581
la clave primaria consta de dos partes la parte de la abreviatura del nombre de la tabla y la parte numérica incrementable.
hasta el momento tengo una parte de la funcioon la cual me gustaria hacerla más general, puesto que solo trabaja con un parámetros preestablecidos, alguien tiene una idea de como puedo generalizar la funcion, y esta me funcion con solo dar el nombre de cualquier tabla????

Código:
CREATE FUNCTION f_crearIdAutoincr 
(@NombreTabla varchar(50))
RETURNS varchar(8)
AS
BEGIN
	DECLARE @Max int
	DECLARE @Ident varchar(8)
	set @Ident = upper(SUBSTRing(@NombreTabla,2,3))	
	set @Max =  (select isnull ((select (substring (CodCliente,3,3)) from tCliente),0))
		set @Max=@Max+1		
	--Retorno el valor
	RETURN @Ident+(select RIGHT('0000' + cast(@Max as varchar(4)), 4))
END;
  #2 (permalink)  
Antiguo 02/10/2011, 21:31
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Generador de claves primarias

query dinamico???

declare @query varchar(max)
declare @table varchar(200)
set @query='select * from ' + @table
exec Sp_sqlExec @query


Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 04/10/2011, 15:08
 
Fecha de Ingreso: agosto-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Generador de claves primarias

genial...! no lo habia pensado... gracias Libras por tu respuesta, voy a probar con Query's Dinamicos.
  #4 (permalink)  
Antiguo 05/10/2011, 15:55
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 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

Etiquetas: claves, generador, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:01.