El problema esta q la tabla y la columna no pueden ser declaradas tipo varchar para poder resolver tu problema prueba con lo siguiente
   
Código sql:
Ver original- CREATE FUNCTION GenerarId 
- (    
-     @Id    VARCHAR(50),  
-     @Tabla VARCHAR(50)  
- ) 
-     RETURNS INT 
- AS 
- BEGIN 
-   
-     DECLARE @MAX INT             -- Variable de Salida q me Captura el Id 
-      
-     DECLARE @SQL NVARCHAR(MAX)   -- Variable para Ejecutar una Sentencia SQL     
-     DECLARE @Param NVARCHAR(MAX) -- Variable para Mandar parametros a la Consulta 
-   
-     SET @Param = N'@ParamId INT OUTPUT' -- Variable a Enviar 
-     SET @SQL = N'SELECT @ParamId = MAX(' + @Id + ')  
-                  FROM ' + @Tabla + ';' 
-   
-     EXECUTE SP_EXECUTESQL @SQL, @Param, @ParamId = @MAX OUTPUT; 
-   
-     IF @MAX IS NULL 
-         SET @MAX = 1; 
-     ELSE 
-         SET @MAX = @MAX + 1; 
-          
-     RETURN @MAX 
- END 
lo que realiza el codigo es primero crear una variable nvarchar q recibira la cadena sql ( en formato texto ) luego a traves de la variable @Param le enviamos los parametros a declarar como si fuera un declare normal pero como se va a ejecutar en forma de cadena nuestra sentencia sql entonces debemos declarar la variable param.Nota q el parametro declarado es de tipo output ya q lo necesitamos para q nos devuelva el max de la tabla puedes incluir otras variables para poder hacer verificaciones (where) .
al final se ejecuta la variable sql a traves del proc. SP_EXECUTESQL enviamos los parametros y al final recibimos la variable de salida para tomar el valor devuelto y lo resto es historia.