Dividir uma coluna para várias colunas, mas os dados variam de acordo com o SQL
Eu tenho um conjunto de linhas no meu banco de dados que se parecem com isso:
Mr Joe Bloggs
Joe Bloggs
Joe Jim Bloggs
Joe Jim David Bloggs
Mr Joe Jim Bloggs
Mr Joe Jim David Bloggs
Saída exigida:
Title | First Name | Middle Name | Surname
------------------------------------------
Mr | Joe | x | Bloggs
x | Joe | x | Bloggs
x | Joe | Jim | Bloggs
x | Joe | Jim David | Bloggs
Mr | Joe | Jim | Bloggs
Mr | Joe | Jim David | Bloggs
Isso será executado em um SQL Stored Procedure. O que eu preciso é esta saída gerada durante o loop através de um CURSOR e as 4 variáveis para atualizar as 4 colunas no banco de dados. Mas como você pode ver os dados estão em 1 coluna e varia.
Eu estou achando difícil entender a melhor maneira de fazer isso e gostaria de sua ajuda por favor. Deixe-me saber se você precisar de mais alguma coisa.
Perguntas semelhantes às minhas, mas eu sinto que estas não me dão a resposta completa que eu preciso ou eu acho que não responde a minha pergunta:
Dividir coluna de coluna em várias cadeias de colunasdividir resultados selecionados (uma coluna) em várias colunasColuna única SQL dividida por colunas múltiplasComo posso dividir o valor da coluna em diferentes colunas no SQLConsulta SQL para dividir uma coluna em duas colunasColuna da tabela dividida em duas colunas em sql?EDITAR:
--Temporary Table to Merge the full name together in order to split by comma. Each split will have a unique record but with the same address information for each name.
CREATE TABLE #TempOutput
(
ClientReference varchar(MAX),
Prefix varchar(MAX),
Reference int,
MergedFullName varchar(MAX),
FormatName varchar(MAX),
Title varchar(MAX),
FirstName varchar(MAX),
MiddleName varchar(MAX),
Surname varchar(MAX)
)
DECLARE @Ref varchar(MAX)
DECLARE @Prefix varchar(MAX)
DECLARE @Reference int
DECLARE @MergedName varchar(MAX)
DECLARE @FormatName varchar(MAX)
DECLARE @Title varchar(MAX)
DECLARE @FirstName varchar(MAX)
DECLARE @MiddleName varchar(MAX)
DECLARE @Surname varchar(MAX)
DECLARE ExtraNameSplitCursor CURSOR FOR
SELECT
[Client Reference],
Prefix,
Reference,
CASE
WHEN LEFT(Surname,3) = 'Mr,' THEN (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Replace(Surname,'Mr,',''))
WHEN LEFT(Surname,4) = 'Mrs,' THEN (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Replace(Surname,'Mrs,',''))
ELSE (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Surname)
END AS [Merged Full Name]
FROM #StartResults
OPEN ExtraNameSplitCursor
FETCH NEXT FROM ExtraNameSplitCursor INTO @Ref, @Prefix, @Reference, @MergedName
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #TempOutput (ClientReference, Prefix, Reference, MergedFullName)
SELECT @Ref, @Prefix, @Reference, GUID, FROM dbo.fn_SPLIT_LIST_STRING (@MergedName)
--SELECT CASE
-- WHEN @FormatName.GUID = 'Mr ' THEN @Title = 'Mr'
-- WHEN LEFT(@MergedName,4) = 'Mrs ' THEN @Title = 'Mrs'
-- WHEN LEFT(@MergedName,5) = 'Miss ' THEN @Title = 'Miss'
-- WHEN LEFT(@MergedName,3) = 'Ms ' THEN @Title = 'Ms'
-- WHEN LEFT(@MergedName,3) = 'Dr ' THEN @Title = 'Dr'
-- WHEN LEFT(@MergedName,4) = 'Rev ' THEN @Title = 'Rev'
-- WHEN LEFT(@MergedName,5) = 'Lord ' THEN @Title = 'Lord'
-- ELSE @Title = ''
--END AS Title,
--CASE
-- WHEN MID(@MergedName,2,1) = ' ' THEN @FirstName = '' ELSE @FirstName = CHARINDEX(' ', MergedFullName + ' ') FROM #TempOutput AS FirstName
FETCH NEXT FROM ExtraNameSplitCursor INTO @Ref, @Prefix, @Reference, @MergedName, @FlatNo, @HouseName, @HouseNo, @Street, @District, @PostTown, @County, @PostCode
END
CLOSE ExtraNameSplitCursor
DEALLOCATE ExtraNameSplitCursor
--Select statement for temporary table
SELECT
ISNULL(ClientReference,'') AS ClientReference,
ISNULL(Prefix,'') AS Prefix,
ISNULL(Reference,'') AS Reference,
ISNULL(MergedFullName,'') AS MergedFullName,
ISNULL(Title,'') AS Title,
ISNULL(FirstName,'') AS FirstName,
ISNULL(MiddleName,'') AS MiddleName,
ISNULL(Surname,'') AS Surname
FROM #TempOutput Result
ORDER BY ClientReference
for xml auto
--Drop all temporary tables
DROP TABLE #TempOutput
DROP TABLE #StartResults
END