Dividir una columna en varias columnas, pero los datos variarán SQL
Tengo un conjunto de filas en mi base de datos que tienen este aspecto:
Mr Joe Bloggs
Joe Bloggs
Joe Jim Bloggs
Joe Jim David Bloggs
Mr Joe Jim Bloggs
Mr Joe Jim David Bloggs
Salida requerida:
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
Esto se ejecutará en un procedimiento almacenado de SQL. Lo que necesito es esta salida generada mientras recorre un CURSOR y las 4 variables para actualizar las 4 columnas en la base de datos. Pero como puedes ver los datos están en 1 columna y varía.
Me resulta difícil entender la mejor manera de hacerlo y me gustaría recibir su ayuda, por favor. Déjeme saber si usted necesita cualquier otra cosa.
Preguntas similares a las mías, pero siento que no me dan la respuesta completa que necesito o creo que no responde a mi pregunta:
Dividir cadena de columna en múltiples cadenas de columnasdividir los resultados seleccionados (una columna) en varias columnasColumna simple SQL dividida en columnas múltiples¿Cómo puedo dividir el valor de la columna en diferentes columnas en SQLConsulta SQL para dividir una columna en dos columnasTabla de la columna dividida en dos columnas en 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