Realmente no puede restringir la entrada de un UDF a un pequeño conjunto de valores (que yo sepa).
Recomendaría crear una tabulación para los valores enumerados, algo como esto:
CREATE TABLE MyEnumTable (DatePartID tinyint, DatePartValue char(2))
GO
INSERT MyEnumTable(DatePartID, DatePartValue)
SELECT 1, 'yy'
UNION
SELECT 2, 'mm'
UNION
SELECT 3, 'dd'
UNION
SELECT 4, 'hh'
GO
CREATE FUNCTION MyDatePart(@IntervalType tinyint)
RETURNS varchar(255)
AS
BEGIN
IF NOT EXISTS (SELECT * FROM MyEnumTable WHERE DatePartID = @IntervalType)
RETURN 'Invalid IntervalType'
--Do your stuff
DECLARE @DatePartvalue char(2)
SELECT @DatePartValue = DatePartValue
FROM MyEnumTable
WHERE DatePartID = @IntervalType
RETURN @DatePartValue
END
GO
--Check it out
SELECT dbo.MyDatePart(3), dbo.MyDatePart(12)
Por supuesto, mi ejemplo está demasiado simplificado, pero entiendes la idea.
Además, considere hacer que la función sea una función con valores de tabla por razones de rendimiento, si planea usar udf en declaraciones de conjunto. Escribí en un blog sobre las implicaciones de rendimiento de varios tipos de funciones aquí:
http://thehobt.blogspot.com/2009 /02/funciones-escalares-vs-valores-de-tabla.html