Seems like you are wanting to update the original source table that has only Name
with distinct changes to FirstName
, MiddleName
, or LastName
. If so, I would consider creating a view on your source table to standardize your logic for splitting the names, then adding a TRIGGER
using INSTEAD OF UPDATE
on the view to process your updates.
Full example below:
IF OBJECT_ID('a01_parse_test') IS NULL BEGIN
CREATE TABLE a01_parse_test (Id INT PRIMARY KEY NOT NULL IDENTITY(1,1), Name VARCHAR(500))
INSERT a01_parse_test VALUES
('Barack Hussein Obama'),
('George Walker Bush'),
('William Jefferson Clinton'),
('Ronald Wilson Reagan')
END
IF OBJECT_ID('v_ParseNames') IS NOT NULL
DROP VIEW v_ParseNames
GO
CREATE VIEW v_ParseNames
AS
SELECT
Id, -- Whatever the id is of your parsing table
LEFT(Name, CHARINDEX(' ', Name)) AS FirstName,
CASE WHEN CHARINDEX(' ', Name) <> LEN(Name) - CHARINDEX(' ', REVERSE(Name)) + 1
THEN SUBSTRING(Name, CHARINDEX(' ', Name)+ 1, LEN(Name) - CHARINDEX(' ', REVERSE(Name))-CHARINDEX(' ', Name))
END AS MiddleName,
RIGHT(Name, CHARINDEX(' ', REVERSE(Name))) AS LastName
FROM a01_parse_test
GO
-- Create instead of update trigger on the view to update names separately
CREATE TRIGGER tg_v_ParseNames_Update ON v_ParseNames
INSTEAD OF UPDATE AS BEGIN
UPDATE TGT SET
Name = SRC.FirstName
+ (CASE WHEN LEN(SRC.MiddleName) > 0 THEN ' ' + SRC.MiddleName ELSE '' END)
+ ' ' + SRC.LastName
FROM a01_parse_test TGT
INNER JOIN INSERTED SRC
ON SRC.Id = TGT.Id
END
GO
SELECT * FROM v_ParseNames WHERE Id = 3
UPDATE v_ParseNames SET FirstName = 'Bill' WHERE Id = 3
SELECT * FROM v_ParseNames WHERE Id = 3
So before a change
Id FirstName MiddleName LastName
----------- --------------- --------------- ---------------
1 Barack Hussein Obama
2 George Walker Bush
3 William Jefferson Clinton
4 Ronald Wilson Reagan
The UPDATE statement then can just update a first name:
UPDATE v_ParseNames SET FirstName = 'Bill' WHERE Id = 3
Then after the update statement ran:
Id FirstName MiddleName LastName
----------- --------------- --------------- ---------------
3 Bill Jefferson Clinton