Zunehmender alphanumerischer Wert in frei belegbare Funktions
-
13-09-2019 - |
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
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