Каковы различные способы обработать 'Перечисления' в SQL-сервере?

Для использования наименьшего количества суммы пространства, необходимо использовать поле CHAR, ограниченное для 'Y' или 'N'. Oracle не поддерживает БУЛЕВСКУЮ ПЕРЕМЕННУЮ, BIT или Типы данных tinyint, таким образом, один байт CHAR является столь маленьким, как можно добраться.

6
задан tpower 13 October 2009 в 08:30
поделиться

5 ответов

Это может быть спорным: я считаю, что не используйте перечисления в T-SQL. T-SQL на самом деле не разработан таким образом, чтобы делать перечисления полезными, как в других языках. На мой взгляд, в T_SQL они просто добавляют усилий и усложняют работу без преимуществ, наблюдаемых где-либо еще.

3
ответ дан 10 December 2019 в 02:51
поделиться

Я могу предложить два разных подхода:

1) Определите таблицу перечисления со столбцом идентификаторов tinyint в качестве первичного ключа и значением перечисления как уникальным индексом; например

CREATE TABLE [dbo].[Market](
        [MarketId] [smallint] IDENTITY(1,1) NOT NULL,
        [MarketName] [varchar](32) COLLATE Latin1_General_CS_AS NOT NULL,
 CONSTRAINT [PK_Market] PRIMARY KEY CLUSTERED
(
        [MarketId] ASC
) ON [PRIMARY]
) ON [PRIMARY]

Затем либо:

  • Пусть ваше приложение загрузит перечисление в сопоставление значений первичного ключа при запуске (при условии, что оно останется постоянным).
  • Определите функцию для преобразования значений перечисления в значения первичного ключа. Эта функция затем может использоваться сохраненными процедурами, вставляющими данные в другие таблицы, чтобы определить внешний ключ в таблице перечисления.

2) Согласно (1), но определите каждое значение первичного ключа как степень 2. Это позволяет другой таблице напрямую ссылаться на несколько значений перечисления без необходимости в дополнительной таблице ассоциаций. Например, предположим, что вы определяете таблицу перечисления Color со значениями: {1, 'Красный'}, {2, 'Синий'}, {4, 'Зеленый'}. Другая таблица может ссылаться на значения красного и зеленого, включая внешний ключ 5 (т.е. побитовое ИЛИ 1 и 4).

2
ответ дан 10 December 2019 в 02:51
поделиться

Скалярная функция, определяемая пользователем? Не идеально, но функционально ...

CREATE FUNCTION dbo.ufnRGB (
    @Colour varchar(20)
)
RETURNS int
AS
BEGIN
    DECLARE @key int

    IF @Colour = 'BLue'
        SET @key = 1 
    ELSE IF @Colour = 'Red'
        SET @key = 2
    ELSE IF @Colour = 'Green'
        SET @key = 3 

    RETURN @KEy
END
2
ответ дан 10 December 2019 в 02:51
поделиться

Мне не нравится идея определять, какие фактически константы для хранимых процедур в нескольких местах - это похоже на кошмар обслуживания и легко подвержен ошибкам (опечаткам и т. д.). На самом деле, я не вижу многих обстоятельств, когда вам нужно было бы сделать такую ​​вещь?

Я бы определенно сохранил все определения перечисления в одном месте - в ваших классах C #. Если для этого придется каждый раз передавать их своим процедурам, пусть будет так. По крайней мере, таким образом они всегда определяются только в одном месте.

Чтобы упростить это, вы можете написать несколько вспомогательных методов для вызова ваших процедур, которые автоматически передают параметры перечисления для вас. Таким образом, вы вызываете вспомогательный метод только с именем процедуры и параметрами «переменной», а затем вспомогательный метод добавляет за вас остальные параметры перечисления.

1
ответ дан 10 December 2019 в 02:51
поделиться

Как насчет использования скалярной функции в качестве константы. Соглашение об именах приближает их использование к перечислениям:

CREATE FUNCTION COLOR_RED()  
RETURNS INT  
AS  
BEGIN  
    RETURN 1  
END  

CREATE FUNCTION COLOR_GREEN()  
RETURNS INT  
AS  
BEGIN  
    RETURN 2  
END  

...
1
ответ дан 10 December 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: