Al momento de utilizar estas dos variables del lenguaje al mismo tiempo, nos pasa que una “pisa” a la otra. Es decir, si ejecuto un UPDATE y quiero saber la cantidad de filas modificadas con @@RowCount y más abajo quiero capturar el error (si lo hubiera), el @@Error tomaria el error de la asignacion del @@RowCount a una variable. Ej.:

Declare @NumeroError int
Declare @Modif int

UPDATE  Clientes
SET 
      Codigo = TMP.Cod_Cte,
      Descripcion = TMP.Nom_Ent

FROM T_NvosCtes TMP
INNER  JOIN Clientes Cte ON  Cte.Codigo = TMP.Cod_Cte

SET @Modif = @@RowCount
SET @NumeroError = @@Error

Al hacer el primer select (el de filas modoficadas) ya el @@Error captura esta asignación y debolvera siempre 0 ya que no hubo error en la asignación.

Para resolver esto cambiamos la forma de asignar los valores a las variables, utilizando un SELECT:

Select @Altas = @@RowCount
@NumeroError = @@Error