2009-06-12 89 views
2

我试图在SQL Server 2005下编写一个用户定义的函数,该函数会将字母数字值的整数部分加1。例如,uf_AlphanumericIncrease ('A000299')应返回'A000300'。这是我迄今为止所做的;在用户定义的函数中增加字母数字值

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 

但是,正如你所看到的,它只适用于最后一位数字。我需要把它放在循环中,这样它才能适用于A002999等等。有任何想法吗?

编辑:给定的值可能具有比一个字符更长的字母前缀,或者根本没有。

+0

我没有给你任何解决办法,但很好奇,并且它可以帮助那些回答您的问题,您希望A99增加到什么程度。 (A100是显而易见的答案,但是您可以处理额外的数字吗?) – 2009-06-12 14:58:37

+0

达到限制时额外的数字是正确的。在这种情况下,A100就是我的GUI界面所做的 - 我需要在UDF下进行这项工作,因为我正在编写一个将追加数据的触发器。 – 2009-06-12 15:01:26

+0

alpha部分是否总是一个字符或者函数是否必须处理更多(例如'AB001'=>'AB002')? – Joe 2009-06-12 15:12:56

回答

4

现在与前缀和数字部分(以及高达20个)

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

假设你的字母数字的Alpha部分始终只有第一个字符的任意长度,这应该工作。

编辑:好的,如果阿尔法部分长度不同,这很容易为UDF丑陋丑陋。这只是一个快速和肮脏的解决方案,所以它可能会优化一点,但逻辑应该是健全的。

再次编辑:PATINDEX()FTW - 我今天学到新的东西;-)

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