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

时间:2009-05-28 09:28:18

标签: sql-server

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

AnimalType TINYINT

/*
  AnimalType can be one of the following :-
  1. Cat
  2. Dog
  3. Bird
 ....
*/

无论如何,我可以将其设为自定义类型/枚举。 例如。

AnimalType ANIMAL

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

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

干杯!

修改

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

4 个答案:

答案 0 :(得分: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

SELECT语句可以像这样使用UDF:

SELECT A.AnimalName, dbo.ihAnimalTypeDesc(A.AnimalType)
FROM Animals A

如果动物属于特定类型,这是一个返回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

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

SELECT AnimalName
FROM Animals
WHERE dbo.IsCat(AnimalType)

答案 1 :(得分:4)

枚举类似于表的FOREIGN KEY,但没有表格。

创建表格并制定FOREIGN KEY约束:

CREATE TABLE AnimalType (id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL)

CREATE TABLE Animal (
        id INT NOT NULL PRIMARY KEY,
        type INT NOT NULL,
        name VARCHAR(50) NOT NULL,
        CONSTRAINT FK_animal_type FOREIGN KEY (type) REFERENCES AnimalType(id)
    )

答案 2 :(得分:4)

您可以尝试添加以下内容:

CREATE VIEW AnimalType AS
    SELECT 
     10 AS Cat
    ,20 AS Dog
    ,30 AS Bird

使用它:

DECLARE @animal INT    
SELECT @animal = Bird FROM AnimalType

答案 3 :(得分:1)

根据您的最新编辑,关于需要传递参数。除了繁重的SQL之外,T-SQL还有简单的基础知识。没有枚举数据类型。如果这是您想要的,您可以通过以下方式处理它:

create procedure YourProcedure
(    @param1   int
    ,@param2   varchar(5)
    ,@param3   varchar(5)
)
as

DECLARE @Value3  int

IF @param1 IS NULL OR @param1<1 OR @param1>5
BEGIN
    return 1 --error out of range param
END

IF NOT EXISTS (SELECT Value FROM LookUpTable WHERE Value=@param2)
BEGIN
    return 2 --error out of range param
END

SELECT @Value3=IntValue FROM OtherLookupTable WHERE StrValue=@param3
IF @Value3 IS NULL
BEGIN
    return 3 --error out of range param
END


--do work here


go