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

Simular autonumerico sobre varchar evitando colisiones

Estas en el tema de Simular autonumerico sobre varchar evitando colisiones en el foro de SQL Server en Foros del Web. Hola gente linda, estoy con una duda, quizá puedan darme una mano. Resulta que necesito ingresar un nuevo registro con un id unico en una ...
  #1 (permalink)  
Antiguo 02/05/2012, 09:26
 
Fecha de Ingreso: julio-2007
Mensajes: 178
Antigüedad: 17 años, 4 meses
Puntos: 1
Simular autonumerico sobre varchar evitando colisiones

Hola gente linda, estoy con una duda, quizá puedan darme una mano.

Resulta que necesito ingresar un nuevo registro con un id unico en una tabla (albt), esta misa tabla es consultada por otros desde el mismo sitio hecho en PHP.

Ahora, por cuestiones de diseño (obviamente del programador anterior) no puedo usar autonumericos y ademas el tipo del campo id es VARCHAR y tiene un formato especifico por ejemplo '00215645'

La pregunta es: Como puedo insertar un nuevo registro con el siguiente numero de ese campo, teniendo en cuenta los ceros Y PARA PEOR usando algun tipo de bloqueo para que nadie lo cree antes de que yo termine ?

Por ahora tengo esto:

Código:
BEGIN TRAN BEGIN TRY

 INSERT INTO albt(id)

SELECT     MAX(id) + 1

FROM albt 

COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN END CATCH
Hay varios problemas, en primer lugar el resultado que obtengo es '215646' en lugar de '00215646' como debería ser, y después... que tan seguro es obtener el máximo con MAX() sobre un campo VARCHAR

Bueno como verán estoy un poco preocupado con estos problemas y me seria muy útil su ayuda!

Suerte!
  #2 (permalink)  
Antiguo 02/05/2012, 09:46
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Simular autonumerico sobre varchar evitando colisiones

Los ceros de la izquierda, los puedes colocar mediante REPLICATE, ve este ejemplo:

-- Se colocan 10 ceros a la izquierda
declare @myint int
set @myint = 234
select replicate ('0',(10 - len(@myint))) + convert(varchar, @myint)
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 02/05/2012, 12:39
 
Fecha de Ingreso: julio-2007
Mensajes: 178
Antigüedad: 17 años, 4 meses
Puntos: 1
Respuesta: Simular autonumerico sobre varchar evitando colisiones

Hola iislas, gracias por responder tan rapido.. investigando un poco llegue a esto que me funciona perfectamente:

Código:
INSERT INTO albt(id)
		SELECT LEFT(REPLACE(STR(CAST(MAX(id) + 1 AS VARCHAR(8)), 8), \' \', \'0\'), 8)
		FROM albt
		SELECT LEFT(REPLACE(STR(CAST(MAX(id) AS VARCHAR(8)), 8), \' \', \'0\'), 8) as tempnumalb
Pero aun no logro resolver el poder bloquear la tabla correctamente, ya que si agrego

Código:
BEGIN TRAN BEGIN TRY
 ...consulta...
COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN END CATCH
En el siguiente paso de PHP usando mssql_query() falla y no continua, como si aun estuviese bloqueada.

Alguna idea ?
  #4 (permalink)  
Antiguo 02/05/2012, 12:43
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Simular autonumerico sobre varchar evitando colisiones

Claro, porque las transacciones deben ser manejadas en el motor y no definidas desde el cliente, para eso, debes crear STORE PROCEDURE que te ejecute la instruccion y tu desde PHP ejecutar ese store procedure con sus parametros correspondientes.

O bien, ir al grupo de PHP y plantear tu duda, para recibir una mejor respuesta en cuanto a PHP
__________________
MCTS Isaias Islas

Etiquetas: evitando, registro, select, simular, tabla, varchar, campos
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 09:19.