El primer problema que le noto, es que no veo dónde inicializas la variable de usuario
@last, la que en el momento de ejecutarse debe valer NULL, por lo que el conector puede estar devolviendo basura...
Yo probaría simplemente que la última línea fuese
De ese modo, recuperaría el valor del ID como resultado de la ejecución del SP, o bien, lo pondría como parámetro OUT, de modo de leerlo desde el prototipo de la llamada.
Claro que todas estas cosas serían muchísimo más simples si programaras en .Net...