Вы можете попробовать использовать тип данных sql_variant для UDF. (У меня нет BTW)
Однако простой встроенный ISNULL все равно использует тип данных 1-го аргумента.
Если вы не предоставили нам полную информацию в вопросе о том, чего вы намерены достичь ...
Редактировать: после обновления
Смысл ISNULL в том, чтобы заменить NULL (1-й аргумент) значением (2-й аргумент).
Нет "типа" NULL. Int или varchar могут принимать значение NULL. Но это все еще базовый тип данных
ISNULL в любом случае ограничивает 2-й аргумент 1-м типом: 2-й аргумент должен быть неявно преобразованным. Так что SELECT ISNULL(CAST(NULL AS int), 'foo')
потерпит неудачу
Итак, используйте встроенный ISNULL, который делает то, что вы хотите. А udf не нужен
Редактировать, после комментария
У вас не может быть одного udf, чтобы охватить все типы данных.
Не менее важно, что у udf есть один тип возвращаемых данных.