2009-06-12 3 views
2

J'essaye de coder une fonction définie par l'utilisateur sous SQL Server 2005 qui va augmenter la partie entière de la valeur alphanumérique de un. Par exemple, uf_AlphanumericIncrease ('A000299') doit renvoyer "A000300". Voici ce que j'ai fait jusqu'ici;Augmentation de la valeur alphanumérique dans la fonction définie par l'utilisateur

ALTER FUNCTION uf_AlphaNumericIncrement 
(
@ID varchar(10) 
) 
RETURNS VARCHAR(10) AS 
BEGIN 
    DECLARE @RES varchar(10); 
    IF SUBSTRING(@ID,LEN(@ID),1)='9' 
     SET @RES=SUBSTRING(@ID,1,LEN(@ID)-2)+CAST (CAST(SUBSTRING(@ID,LEN(@ID)-1,1) AS smallint)+1 AS VARCHAR(10))+'0'; 
    ELSE 
     SET @RES=SUBSTRING(@ID,1,LEN(@ID)-1)+CAST (CAST(SUBSTRING(@ID,LEN(@ID),1) AS smallint)+1 AS VARCHAR(10)); 
    RETURN @RES; 
END 

Mais comme vous pouvez le voir ne fonctionne que pour le dernier chiffre. Je dois l'obtenir sous la boucle ainsi elle peut fonctionner pour A002999 et ainsi de suite. Des idées? Editer: La valeur donnée peut avoir un préfixe alpha supérieur à un caractère, ou aucun.

+0

Je n'ai pas de solution pour vous, mais je suis curieux, et il peut aider ceux qui répondent à votre question, ce que vous aimeriez A99 à incrémenter. (A100 est la réponse évidente, mais pouvez-vous composer avec le chiffre supplémentaire?) –

+0

Le chiffre supplémentaire est correct quand la limite est atteinte. Dans ce cas, A100 est ce que fait mon interface graphique - j'en ai besoin sous UDF car je suis en train de coder un déclencheur qui va ajouter des données. –

+0

Est-ce que la partie alpha est toujours un caractère ou est-ce que la fonction doit en gérer plus (par exemple 'AB001' => 'AB002')? – Joe

Répondre

4

travaille maintenant avec une longueur de préfixe et numéro de pièce (bien jusqu'à 20 chacun)

DECLARE @prefix varchar(20), @numberstr varchar(20), @number int, @Val varchar(40) 

SELECT @Val = 'ABCD000006' 
--SELECT @Val = 'A03' 

SELECT @prefix = LEFT(@Val, PATINDEX ('%[0-9]%', @Val) -1) 
SELECT @numberstr = SUBSTRING(@Val, PATINDEX ('%[0-9]%', @Val), 8000) 
SELECT @number = CAST(@numberstr AS int) + 1 
SELECT @prefix + RIGHT(REPLACE(SPACE(LEN(@numberstr)), ' ', '0') + CAST(@number AS varchar(20)), LEN(@numberstr)) 
+0

La longueur du préfixe peut varier. Comme ARD0001. Comment avez-vous déterminé la longueur du préfixe? –

+1

Utilisez PATINDEX pour trouver le premier numéro. Réponse mise à jour – gbn

+0

Fonctionne très bien, j'avais changé le '6' statique à LEN (@Val) -LEN (@prefix) avant NewWal à votre solution précédente, mais cela fonctionne aussi. Merci beaucoup. –

2

Si l'on suppose que la partie alpha de votre alphanumérique est toujours seul le premier caractère, cela devrait fonctionner.

EDIT: OK, si la longueur de la partie alpha est trop longue, cela devient assez rapide pour une fonction UDF. Ceci est juste une solution rapide et sale, donc il peut probablement être optimisé un peu, mais la logique devrait être solide.

EDIT DE NOUVEAU: patindex() FTW - j'appris quelque chose de nouveau aujourd'hui ;-)

ALTER FUNCTION uf_AlphaNumericIncrement 
(
@ID varchar(10) 
) 
RETURNS VARCHAR(10) AS 
BEGIN 
    DECLARE @RES varchar(10); 
    DECLARE @num int; 
    DECLARE @prefix varchar(10); 
    set @prefix = left(@id, patindex('%[0-9]%', @id) -1) 
    set @num = cast(right(@id, len(@id) - len(@prefix)) as int) + 1 
    set @res = @prefix + replicate('0', len(@id) - len(@prefix) - len(@num)) + cast(@num as varchar(10)) 

    RETURN @RES; 
END 
+0

J'aurais dû faire une question claire sur la partie alpha à la première place, alors je l'ai édité maintenant. –

2
CREATE FUNCTION dbo.uf_ANinc 
(
    @in varchar(10) 
) 
RETURNS varchar(10) AS 
BEGIN 
    DECLARE @prefix varchar(10); 
    DECLARE @res varchar(10); 
    DECLARE @pad varchar(10); 
    DECLARE @num int; 
    DECLARE @start int; 

    SET @start = PATINDEX('%[0-9]%',@in); 
    SET @prefix = LEFT(@in, @start - 1); 
    SET @num = CAST( RIGHT(@in, LEN(@in) - @start) AS int ) + 1 
    SET @pad = REPLICATE('0', 10 - LEN(@prefix) - CEILING(LOG(@num)/LOG(10))); 
    SET @res = @prefix + @pad + CAST(@num AS varchar); 

    RETURN @res 
END 
GO 

SELECT dbo.uf_ANinc('ABC000123'); 
Questions connexes