زيادة القيمة الأبجدية الرقمية في وظيفة تعريف المستخدم
-
13-09-2019 - |
سؤال
أحاول رمز وظيفة محددة من قبل المستخدم ضمن 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