1) When a stored procedure isn't working properly, the problem is often some sort of corruption of the query tree that is stored in the sysprocedures table when the procedure is recreated. Dropping and recreating the procedure forces ASE to create a new query tree that presumably is not corrupt.
2) No, sp_fixindex only needs to be run on a system table index after it is found to be corrupt. What should be run on a regular basis is dbcc checkdb, dbcc checktable, or dbcc checkindex to verify that the indexes are sound.