Du kan egentligen inte begränsa inmatningen av en UDF till en liten uppsättning värden (såvitt jag vet).
Jag skulle rekommendera att skapa en tabell för dina uppräknade värden - ungefär så här:
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)
Naturligtvis är mitt exempel alltför förenklat, men du fattar.
Överväg också att göra funktionen till en tabellvärderad funktion av prestationsskäl, om du planerar att använda udf i set-satser. Jag bloggade om prestandakonsekvenserna av olika funktionstyper här:
http://thehobt.blogspot.com/2009 /02/scalar-functions-vs-table-valued.html