ALTER PROCEDURE [P_Batch_Temp_Table] @User nvarchar(100), @Prog nvarchar(2), @Type nvarchar(4) as
DECLARE @UserN nvarchar(100)
SET @UserN = @User
select * into ##Temp_Batch_ + @UserN
from tbl_batch WHERE PROD = @progN and TYPE = @TypeN and [User] = @UserN
You can use dynamic SQL, but I have NEVER seen this as part of a good database design:
declare @MyBadDynamicSQLString as varchar(500)
set @MyBadDynamicSQLString = 'select * into ##Temp_Batch_' + @UserN + 'from tbl_batch WHERE PROD = @progN and TYPE = @TypeN and [User] = @UserN'
If it's not practically useful, then it's practically useless.