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