Подтвердить что ты не робот

Могу ли я иметь пользовательский тип данных перечисления в 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) и т.д.

4b9b3361

Ответ 1

Нет типов перечислений. Тем не менее, вы можете создавать пользовательские функции для перевода вперед и назад между INT, которые вы сопоставляете с перечисленными значениями.

Чтобы создать дружественные имена для AnimalType на основе "INT", вы можете сделать что-то вроде этого:

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

Здесь UDF возвращает true или false, если животное имеет определенный тип:

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)

Ответ 2

Перечисление похоже на 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)
    )

Ответ 3

Вы можете попробовать добавить что-то вроде этого:

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

чтобы использовать его:

DECLARE @animal INT    
SELECT @animal = Bird FROM AnimalType

Ответ 4

в соответствии с вашим последним правлением, о необходимости прохождения параметров. T-SQL имеет основы для простых вещей в дополнение к тяжелому подъему 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 [email protected])
BEGIN
    return 2 --error out of range param
END

SELECT @Value3=IntValue FROM OtherLookupTable WHERE [email protected]
IF @Value3 IS NULL
BEGIN
    return 3 --error out of range param
END


--do work here


go