If you run the exec stored procedure command in SSMS, it produces this script:
USE [MY_DB]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[usr_DailyReportsEmpty]
@username = N'someuser'
SELECT 'Return value' = @return_value
GO
However when I run the script the EXEC returns 16 and the SELECT returns 0. Why is that?
You need to change the procedure to explicitly RETURN the value you wish to capture. As Barry Kaye mentioned above when you simply select a value to return a result set the procedure returns 0 for success but if you use the RETURN statement the procedure will return that value.
In the following example, 1 will be selected as a result set when the first procedure is executed but the value captured in @return1 will be 0 for success. The second procedure will not have a result set and the value captured in @return2 will be 3.