JUAN CASTELLÓN

Random Coffee

Haz clic aquí para editar.
  • Inicio
  • Blog
  • Apps
  • Contactame

3/20/2014

Problema Alfanumérico Resuelto – SQL [LA SOLUCIÓN FÁCIL]

0 Comentarios

Read Now
 
Imagen
Casualmente me encontré con un problema que de primas a primeras parecía ser sencillo. Una base de datos en SQL 2008 donde tenía que seleccionar el ultimo numero registrado cuyo campo alfanumérico debía ser convertido a entero e incrementado en ++. A como es usual hice la clásica búsqueda en Google sin embargo no era lo que esperaba, únicamente encontré algoritmos que decían muy poco y sugerencias que me dejaban más largo de la solución.

El alfanumérico era algo así: 280-304578-380

Intente convertirlo con la función CAST Y con la función CONVERT:

SELECT CAST(MAX(NoJuez)  AS NVARCHAR(11))+1  FROM Jueces order by NoJuez desc

Y el resultado era el mismo: “NO SE PUEDE CONVERTIR EL TIPO DE DATO A INT”.  Entonces claramente lo que había que hacer era eliminar los guiones del campo y lo que hice fue reemplazarlos por 0 (cero) = un digito que no iba a afectar mi cifra hasta que mis tres últimos dígitos llegasen al 999 lo que en este caso nunca sería posible por las reglas del negocio. Al final pensé que lo había resuelto:

SELECT top 1 CAST(REPLACE(NoJuez,'-',0) AS INT)+1  FROM Jueces order by NoJuez desc

La conversión está bien ahora el NoJuez era:  28003045780380 sin embargo todavía tenía un error: “La conversión del digito ha sobrepasado a INT”.  Volví a buscar en Google y encontré varios errores similares relacionados únicamente al procesamiento de códigos de barra. Al final todo era una respuesta obvia que había olvidado completamente en la clase x sobre el manejo de los tipos de datos y sus límites, al final solo era convertirlo en BIGINT:

 insert into Jueces (NoJuez)
SELECT top 1 CAST(REPLACE(NoJuez,'-',0) AS BIGINT)+1  FROM Jueces order by NoJuez desc


Al final para no lidiar con el problema de los 0s (ceros) encontré una función en el blog de PINAL DAVE con la que capture únicamente los números dejando el resultado así: 280304578381 (ya sumado el +1)

CREATE FUNCTION dbo.UDF_ParseAlphaChars
(
@string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @IncorrectCharLoc SMALLINT
SET @IncorrectCharLoc = PATINDEX(‘%[^0-9]%’, @string)
WHILE @IncorrectCharLoc > 0
BEGIN
SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
SET @IncorrectCharLoc = PATINDEX (‘%[^0-9]%’, @string)
END
SET @string = @string
RETURN @string
END
GO

Share

0 Comentarios

Tu comentario se publicará una vez que se apruebe.


Deja una respuesta.

Con tecnología de Crea tu propio sitio web único con plantillas personalizables.
  • Inicio
  • Blog
  • Apps
  • Contactame