Начиная с SQL Server 2012, вы можете использовать функцию FORMAT
, как описано в других ответах. Если вы хотите отформатировать строковое значение, например, 'abcde', вы можете использовать только строковые функции, подобные этой:
DECLARE @str VARCHAR(100) = '845907392';
-- 845-907-392
SELECT REVERSE(SUBSTRING(REVERSE(@str), 7, 3))
+ CASE WHEN LEN(@str)>6 THEN '-' ELSE '' END
+ REVERSE(SUBSTRING(REVERSE(@str), 4, 3))
+ CASE WHEN LEN(@str)>3 THEN '-' ELSE '' END
+ REVERSE(SUBSTRING(REVERSE(@str), 1, 3))
Вы также можете создать функцию:
CREATE FUNCTION dbo.GetFormatTripleDash (@str varchar(255))
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @retStr VARCHAR(255) = REVERSE(SUBSTRING(REVERSE(@str), 7, 3))
+ CASE WHEN LEN(@str)>6 THEN '-' ELSE '' END
+ REVERSE(SUBSTRING(REVERSE(@str), 4, 3))
+ CASE WHEN LEN(@str)>3 THEN '-' ELSE '' END
+ REVERSE(SUBSTRING(REVERSE(@str), 1, 3))
RETURN(@retStr)
END
Вы можете используйте эту функцию следующим образом:
-- 845-907-392
SELECT dbo.GetFormatTripleDash('845907392')
Более гибкое решение с использованием функции. Теперь вы можете использовать намного более длинное строковое значение и определить размер детали, разделенный символом -
.
CREATE FUNCTION dbo.GetFormatDash (@str varchar(255), @partSize INT = 3)
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @startSize INT = 0;
DECLARE @retStr VARCHAR(255) = '';
WHILE @startSize < LEN(@str)
BEGIN
SET @retStr = REVERSE(SUBSTRING(REVERSE(@str), @startSize + 1, @partSize)) + CASE WHEN @startSize > 0 THEN '-' ELSE '' END + @retStr;
SET @startSize = @startSize + @partSize;
END
RETURN(@retStr)
END
Вы можете использовать эту улучшенную функцию следующим образом:
-- 12-345-678-901-234-567-890
SELECT dbo.GetFormatDash('12345678901234567890', DEFAULT)
SELECT dbo.GetFormatDash('12345678901234567890', 3)
-- 12345-67890-12345-67890
SELECT dbo.GetFormatDash('12345678901234567890', 5)
демо на dbfiddle.uk