Просто еще один вариант для развлечения, если вы не возражаете против вспомогательной функции.
Спасибо Shnugo за образец данных и смешное имя (которое я редактировал) + 1
FYI - TVF можно легко перенести в CROSS APPLY
Пример
DECLARE @mockupTable TABLE(ID INT IDENTITY, YourNameString VARCHAR(1000));
INSERT INTO @mockupTable VALUES
('Juan Dela Cruz Eugenio')
,('Jhon Lester')
,('Jhon MiddleName Lester')
,('Pablo Diego José Francisco de Paula Juan Nepomuceno Picasso');
Select A.*
,FirstName = Pos1
,MiddleInit = concat(nullif(
concat( left(Pos2+Pos3,1)
,left(Pos3+Pos4,1)
,left(Pos4+Pos5,1)
,left(Pos6+Pos7,1)
,left(Pos7+Pos8,1)
,left(Pos8+Pos9,1)
)
,'')+'.','')
,LastName = coalesce(Pos9,Pos8,Pos7,Pos6,Pos5,Pos4,Pos3,Pos2)
From @mockupTable A
Cross Apply [dbo].[tvf-Str-Parse-Row](YourNameString,' ') B
Возвращает
Функция, если интересно
ALTER FUNCTION [dbo].[tvf-Str-Parse-Row] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
From ( values (cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml))) as A(xDim)
)