I don't find PRINT very helpful for debugging - its too fragile if concatenating values to make the single string it needs and one of them is the wrong type, or NULL (in which case the whole string becomes NULL unless you take evasive action with COALESCE(,,,) or similar.
Dunno if what we do would suit you? all our Stored Procedures take a final parameter of @intDebug and if that is set to 1 then a SELECT statement is used to display debug data.
SELECT Col1, Col2, ...
WHERE ColX = @MyParameter
ORDER BY ...
SELECT @intRowCount = @@ROWCOUNT, @intErrNo = @@ERROR
IF @intDebug = 1 SELECT [MySProcName]='DEBUG(1)',
The DEBUG(1) is intended to be a marker so that the location in the code, of the Debug Statement, can easily be found. We aim to use unique IDs in each DEBUG(nnn) message, but obviously its not critical