Należy się zastanowić nad kilkoma rzeczami.
Czy zawsze są podane dwie osoby?
Czy jeśli są to zawsze rozdzielone przecinkami?
To zadanie jest możliwe do wykonania, potrzebna jest tylko analiza danych jakie znajdują się w bazie.
Tutaj masz naiwny parser, który dzieli ciąg na trzy kolumny. Można go wzbogacić o dodatkowe warunki przy wyodrębnianiu tekstu. Wymaga też optymalizacji, m.in. pod kątem długości ciągu, aby uniknąć pustych przebiegów oraz założenia odpowiednich indeksów.
--create table ciagi_znakow (ID INT IDENTITY(1,1),ciag NVARCHAR(MAX))
--insert INTO ciagi_znakow (ciag) values ('Firma Handlowa usługowa "Programista" Jan Kowalski, Maria Kowlaska')
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp (ID INT, separator_1 INT, separator_2 INT)
INSERT INTO #temp (ID)
SELECT ID FROM ciagi_znakow
DECLARE @ptr INT = 26
WHILE EXISTS (SELECT ID FROM #temp WHERE separator_1 IS NULL)
BEGIN
UPDATE t
SET t.separator_1=IIF(t.separator_1 IS NOT NULL,t.separator_1,x.separator_1)
FROM ciagi_znakow cz
JOIN #temp t ON t.ID=cz.ID
CROSS APPLY (SELECT separator_1=iif(SUBSTRING(cz.ciag,@ptr,1)=' ',@ptr,NULL)) x
WHERE t.separator_1 IS NULL
SET @ptr-=1
END
SET @ptr=26
WHILE EXISTS (SELECT ID FROM #temp WHERE separator_2 IS NULL)
BEGIN
UPDATE t
SET t.separator_2=IIF(t.separator_2 IS NOT NULL,t.separator_2,x.separator_2)
FROM ciagi_znakow cz
JOIN #temp t ON t.ID=cz.ID
CROSS APPLY (SELECT separator_2=iif(SUBSTRING(cz.ciag,@ptr+t.separator_1,1)=' ',@ptr+t.separator_1,NULL)) x
WHERE t.separator_2 IS NULL
SET @ptr-=1
END
SELECT ciag
,Nazwa=SUBSTRING(ciag,0,separator_1)
,[Imię 1]=SUBSTRING(ciag,separator_1+1,separator_2-separator_1)
,[Imię 2]=SUBSTRING(ciag,separator_2+1,25)
FROM ciagi_znakow cz
JOIN #temp t ON t.ID=cz.ID