CREATE FUNCTION dbo.FormatCodeDynamic(@input VARCHAR(100)) RETURNS VARCHAR(200) AS BEGIN -- فقط ارقام را استخراج می‌کنیم DECLARE @digits VARCHAR(200) = ''; DECLARE @i INT = 1; DECLARE @len INT = LEN(ISNULL(@input,'')); WHILE @i <= @len BEGIN DECLARE @ch CHAR(1) = SUBSTRING(@input,@i,1); IF @ch >= '0' AND @ch <= '9' SET @digits = @digits + @ch; SET @i = @i + 1; END -- آماده‌سازی متغیرها برای گروه‌بندی پله‌ای DECLARE @L INT = LEN(@digits); DECLARE @pos INT = 1; DECLARE @result VARCHAR(200) = ''; DECLARE @glen INT; -- جدول گروه ها --در اینجا گروه بندی مد نظر من ترکیب 2-2-4-6-2-3-3 بوده، شما میتوانید با توجه به نوع ورودی کد نوسازی، گروه بندی متمایزی در نظر بگیرید. DECLARE @grp TABLE (len INT); INSERT INTO @grp(len) VALUES (2),(2),(4),(6),(2),(3),(3); -- کرسر روی جدول گروه‌ها DECLARE grp_cursor CURSOR FOR SELECT len FROM @grp; OPEN grp_cursor; FETCH NEXT FROM grp_cursor INTO @glen; WHILE @@FETCH_STATUS = 0 AND @pos <= @L BEGIN IF @pos + @glen - 1 <= @L BEGIN IF LEN(@result) > 0 SET @result = @result + '-'; SET @result = @result + SUBSTRING(@digits, @pos, @glen); SET @pos = @pos + @glen; END ELSE BEGIN -- اگر باقیمانده کمتر از اندازهٔ گروه بود، آن باقیمانده را اضافه کن و تمام کن IF LEN(@result) > 0 SET @result = @result + '-'; SET @result = @result + SUBSTRING(@digits, @pos, @L - @pos + 1); BREAK; END FETCH NEXT FROM grp_cursor INTO @glen; END CLOSE grp_cursor; DEALLOCATE grp_cursor; RETURN @result; END; GO PRINT dbo.FormatCodeDynamic('01011004101000')