2009-06-12 28 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'); 
相關問題