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 originalCREATE 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.