我可以在Sql Server中使用自定义枚举数据类型吗?

Pur*_*ome 13 sql-server

在我的sql代码中,我传递了一堆神奇的数字: -

AnimalType TINYINT

/*
  AnimalType can be one of the following :-
  1. Cat
  2. Dog
  3. Bird
 ....
*/
Run Code Online (Sandbox Code Playgroud)

无论如何我可以使这个自定义类型/枚举.例如.

AnimalType ANIMAL
Run Code Online (Sandbox Code Playgroud)

并且它被限制为包含1 < - >之间的数字(例如,在我上面的例子中为3).

或约束到字符串.例如.AnimalType ='猫'等等?

干杯!

编辑

我知道LookUp表是什么.这不是用于查找表,而是用于传递给许多存储过程的一些数据.我希望传入一个枚举或至少一些有约束的数字(例如数字1 < - > 5)等,而不是传入幻数.

Mat*_*ley 8

没有枚举类型.但是,您可以创建用户定义的函数,以便在映射到枚举值的INT之间来回转换.

要为基于'INT'的AnimalType生成友好名称,您可以执行以下操作:

UDF生成友好名称:

CREATE FUNCTION ihAnimalTypeDesc
(
    @AnimalType INT
) 

RETURNS VARCHAR(20)
AS  
BEGIN 
    IF @AnimalType IS NULL
    RETURN NULL

    DECLARE @Temp AS VARCHAR(20)

    SET @Temp = CASE @AnimalType
    WHEN 1 THEN 'Cat'
    WHEN 2 THEN 'Dog'
    WHEN 3 THEN 'Snake'
    END

    RETURN @Temp
END
Run Code Online (Sandbox Code Playgroud)

一个SELECT可能的语句使用UDF像这样:

SELECT A.AnimalName, dbo.ihAnimalTypeDesc(A.AnimalType)
FROM Animals A
Run Code Online (Sandbox Code Playgroud)

如果动物属于特定类型,则返回true或false的UDF:

CREATE FUNCTION IsCat
(
    @AnimalType INT
) 

RETURNS BIT
AS  
BEGIN 
    IF @AnimalType IS NULL
        RETURN NULL

    IF @AnimalType = 1
        RETURN 1

    RETURN 0
END
Run Code Online (Sandbox Code Playgroud)

以下是使用上述UDF的示例.注意:在WHERE子句中执行此操作时,您必须小心性能问题:

SELECT AnimalName
FROM Animals
WHERE dbo.IsCat(AnimalType)
Run Code Online (Sandbox Code Playgroud)