Your error handling is screwed.
The moment you run any code after the line the has an error @@error is reset, you can test this fact with the following:
select 1/0 as bob if @@error<>0 begin print @@error end
Your error checking should be as follows:
SET @Error = @@Error IF @Error <> 0 BEGIN GOTO spERROR END