How do I know if I am already in a transaction when I call a procedure from another one?
I'm not aware of an easy way to do this. Probably the easiest way is to execute a BEGIN WORK followed immediately by an error check. If you get an error, you can check the error code. If you get an error code of 535 (already in transaction)—check for other error codes that your system may also throw here—it means there's a transaction open.
Although there's no global variable, there is probably a SELECT you can do from the system tables or from the sysmaster database.