In the following code, the CTE lists the positions of the first (pos1) and last (pos2) space in the column [name]. If pos1 is 0, pos2 should be 0 too. That means no space in the name. If pos1 is greater than 0 and is equal to pos2, that means only one space in the name.
;WITH CTE_Space_Positions AS (
SELECT [id], [name], CHARINDEX(' ', [name]) AS pos1, CASE WHEN CHARINDEX(' ', [name]) > 0 THEN LEN([name]) - CHARINDEX(' ', REVERSE([name])) + 1 ELSE 0 END AS pos2
FROM [dbo].[EmpHistory]
)
SELECT [id], [name],
CASE WHEN pos1 = 0 THEN [name] ELSE LEFT([name], pos1 - 1) END AS firstname,
CASE WHEN pos2 > pos1 THEN SUBSTRING([name], pos1 + 1, pos2 - pos1 - 1) ELSE '' END AS middlename,
CASE WHEN pos1 = 0 THEN '' ELSE SUBSTRING([name], pos2 + 1, LEN([name]) - pos2) END AS lastname
FROM CTE_Space_Positions;