Вот мое решение, и оно имеет следующие особенности / особенности:
- Может обрабатывать сколько угодно имен в строке.(То есть как менее двух, так и более трех.)
- Все пробелы между именами сохраняются.
Я знаю, что в OP указано, что может быть только 2 или3 имени в его случае.Я не противЯ просто делюсь решением, которое работает, и если оно не подходит для конкретной проблемы, это нормально.
Итак, вот функция:
CREATE FUNCTION dbo.fnGetInitials (@name varchar(max))
RETURNS varchar(max)
AS BEGIN
DECLARE @cutpos int, @spacepos int, @result varchar(max);
DECLARE @cutlist TABLE (CutPos int, SpacePos int);
SET @result = LTRIM(RTRIM(@name));
SET @cutpos = 2;
SET @spacepos = CHARINDEX(' ', @result);
WHILE @spacepos > 0 BEGIN
INSERT INTO @cutlist VALUES (@cutpos, @spacepos);
SET @spacepos = @spacepos + 1;
SET @cutpos = @spacepos + 1;
SET @spacepos = CHARINDEX(' ', @result, @spacepos);
END;
DELETE FROM @cutlist WHERE CutPos >= SpacePos;
SELECT @result = STUFF(@result, CutPos, SpacePos - CutPos, '')
FROM @cutlist
ORDER BY CutPos DESC;
RETURN @result;
END;
А вот тестовый вызов:
SELECT dbo.fnGetInitials(' John Ronald Reuel Tolkien ');
и результат:
----------------------------------------------------------------------------------------------------
J R R Tolkien