Frage

Ich versuche, eine benutzerdefinierte Funktion unter SQL Server Code 2005, der ganzzahlige Teil von alphanumerischen Wert um eins erhöht wird. Zum Beispiel sollte uf_AlphanumericIncrease ('A000299') ‚A000300‘ zurückzukehren. Hier ist, was ich bisher getan;

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 

Aber wie Sie sehen können es nur für letzte Ziffer funktioniert. Ich brauche es unter Schleife zu bekommen, damit es für A002999 und so weiter arbeiten kann. Irgendwelche Ideen?

Edit:. Gegeben Wert könnte alpha Präfix länger als ein Zeichen, oder gar keinen

War es hilfreich?

Lösung

arbeitet nun mit einem beliebigen Länge von Präfix und Zahlenteil (auch bis zu 20 Stück)

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))

Andere Tipps

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');

Unter der Annahme, dass der Alpha-Teil Ihrer alphanumerischen ist immer nur das erste Zeichen, das sollte funktionieren.

EDIT: OK, wenn der Alpha-Teil in der Länge variiert diese ziemlich schnell für eine UDF hässlich wird. Dies ist nur eine schnelle und unsaubere Lösung, so kann es wohl ein wenig optimiert werden, aber die Logik sollte gesund sein.

Erneut bearbeiten: patindex () ftw - Ich lernte etwas Neues heute; -)

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top