زيادة القيمة الأبجدية الرقمية في وظيفة تعريف المستخدم

StackOverflow https://stackoverflow.com/questions/987071

سؤال

أحاول رمز وظيفة محددة من قبل المستخدم ضمن SQL Server 2005 الذي سيزيد الجزء الأمثل من القيمة الأبجدية الرقمية من قبل واحد. علي سبيل المثال، 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 وهلم جرا. أيه أفكار؟

تحرير: قد تحتوي قيمة معينة على بادئة ألفا أطول من حرف واحد، أو لا شيء على الإطلاق.

هل كانت مفيدة؟

المحلول

يعمل الآن مع أي طول البادئة وجزء الأرقام (ما يصل إلى 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))

نصائح أخرى

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

على افتراض أن جزء ألفا من أبجديه الرقمية هو دائما الحرف الأول فقط، يجب أن يعمل هذا.

تحرير: حسنا، إذا كان جزء 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top