EXEC sp_helptext 'your procedure name';
This avoids the problem with INFORMATION_SCHEMA approach wherein the stored procedure gets cut off if it is too long.
Update: David writes that this isn’t identical to his sproc…perhaps because it returns the lines as ‘records’ to preserve formatting? If you want to see the results in a more ‘natural’ format, you can use Ctrl-T first (output as text) and it should print it out exactly as you’ve entered it. If you are doing this in code, it is trivial to do a foreach to put together your results in exactly the same way.
Update 2: This will provide the source with a “CREATE PROCEDURE” rather than an “ALTER PROCEDURE” but I know of no way to make it use “ALTER” instead. Kind of a trivial thing, though, isn’t it?
Update 3: See the comments for some more insight on how to maintain your SQL DDL (database structure) in a source control system. That is really the key to this question.