UDF の入力を小さな値のセットに実際に制限することはできません (私の知る限りでは)。
次のような列挙値の表を作成することをお勧めします:
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)
もちろん、私の例は単純化しすぎていますが、おわかりいただけたでしょうか。
また、set ステートメントで udf を使用する予定がある場合は、パフォーマンス上の理由から関数をテーブル値関数にすることを検討してください。ここで、さまざまな関数タイプのパフォーマンスへの影響についてブログを書きました:
http://thehobt.blogspot.com/2009 /02/scalar-functions-vs-table-valued.html