Un comienzo difícil sería algo como esto:
CREATE FUNCTION udf_GetDataTypeAsString
(
@user_type_id INT ,
@Length INT
)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @ReturnStr VARCHAR(50)
IF @Length = -1
SELECT @ReturnStr = UPPER(name) + '(MAX)'
FROM sys.types
WHERE user_type_id = @user_type_id
ELSE
SELECT @ReturnStr = UPPER(name) + '(' + CONVERT(VARCHAR, @Length) + ')'
FROM sys.types
WHERE user_type_id = @user_type_id
RETURN @ReturnStr
END
GO
SELECT dbo.udf_GetDataTypeAsString(167, -1)
--#### Returns VARCHAR(MAX)
SELECT dbo.udf_GetDataTypeAsString(231, 24)
--#### Returns NVARCHAR(24)
Tenga en cuenta que esto solo es realmente bueno para los tipos de datos char y solo maneja la longitud. Necesitaría implementar un poco más de lógica si desea usar precisión (decimales, etc.)
Además, es posible que desee agregar la validación para permitir solo una longitud de -1 en ciertos tipos de usuarios
(Por curiosidad, ¿por qué quieres hacer esto?)