Using variables works;
DECLARE @NameString varchar(10); SET @NameString = 'Sara' SELECT CASE WHEN @NameString like '% %' THEN SUBSTRING(@NameString, 1, CHARINDEX(' ', @NameString) - 1) ELSE @NameString END AS FirstName, CASE WHEN @NameString like '% %' THEN SUBSTRING(@NameString, CHARINDEX(' ', @NameString) + 1, 8000) ELSE '' END AS LastName
The problem with your code is that it checks that each part will work when passing a static value. I do not like that CHARINDEX(' ', 'Sara') - 1 allowed equal to -1. A hack to get around this would be to wrap this function in an ABS() function;
SELECT CASE WHEN 'Sara' like '% %' THEN SUBSTRING('Sara', 1, ABS(CHARINDEX(' ', 'Sara') - 1)) ELSE 'Sara' END AS FirstName, CASE WHEN 'Sara' like '% %' THEN SUBSTRING('Sara', CHARINDEX(' ', 'Sara') + 1, 8000) ELSE '' END AS LastName
source share