Não acredito que o SQL Server tenha uma função de divisão interna, portanto, além de uma UDF, a única outra resposta que conheço é sequestrar a função PARSENAME:
SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 2)
PARSENAME pega uma string e a divide no caractere ponto. Ele recebe um número como seu segundo argumento e esse número especifica qual segmento da string retornar (trabalhando de trás para frente).
SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 3) --return Hello
Problema óbvio é quando a string já contém um ponto. Eu ainda acho que usar uma UDF é a melhor maneira... alguma outra sugestão?