Как использовать перечисления в TSQL без жесткого кодирования магического числа во всех сценариях / процессах SQL? - PullRequest
16 голосов
/ 14 декабря 2010

В нашем коде C # есть перечисления:

public enum JobStatus
{        
  Ready = 0,      
  Running = 1,        
  Cancelling = 2,
}

Эти значения также хранятся в полях базы данных, и у нас есть лоты TSQL (в основном, хранимые процы, а такжепакетами и службами SSIS), который также обрабатывает данные:

SELECT TOP 1 @JobSID = JobSID
FROM Job 
WHERE Status = 0 /* JobStatus.Ready */
ORDER BY SubmitDate ASC

CREATE TABLE ImportCrossEffect(
    /* lots deleted */      
    Source tinyint 
      DEFAULT 1 NOT NULL -- 0: Unknown (default), 1:Imported, 2:Keyed
) 

Как избежать жесткого кодирования «магических чисел» в TSQL?
Как удалитьриск того, что перечисления не совпадают на сторонах C # и TSQL?

(я включил тег C #, так как я хотел бы, чтобы решение «единого источника» определяло перечисления на обоих C #и стороны TSQL)


Обновления:

У нас нет таблиц в базе данных с именами Enum, значения просто хранятся в крошечныхстолбцы int.

Я надеялся на что-то вроде препроцессора SQL, который "расширит" все перечисление до "магического значения".

Ответы [ 4 ]

7 голосов
/ 14 декабря 2010

Вы всегда можете передать значение из перечисления в хранимую процедуру / команду, которую вы пытаетесь выполнить.Таким образом, вам никогда не придется беспокоиться о перечислениях в базе данных.

Если вы хотите сохранить перечисления в базе данных, то я предлагаю вам создать представление (возможно, озаглавленное вашим перечислением), например так:

create view JobStatus
    select 0 as Ready, 1 as Running, 2 as Cancelling

После этого вы можете получить доступ к представлению или присоединиться к нему, если вам это необходимо.

Обратите внимание, что оптимизатор запросов обрабатывает любую ссылку на приведенное выше как операцию постоянного сканирования / скалярной операции, а несканирование таблицы, поэтому вы не выполняете операции чтения, которые произошли бы, если бы вы обращались к реальной таблице.

1 голос
/ 14 декабря 2010

В одном проекте мы определили атрибут, который применяется к каждому члену перечисления, в котором хранится таблица и значение, ожидаемые в базе данных, и модульные тесты подтвердили связь. Грязный, хотя.

0 голосов
/ 14 декабря 2010

Возможно, вы могли бы реализовать управляемый код на сервере SQL вместо обычного TSQL?Не уверен на 100%, сработает ли это, но это может быть вариант для изучения.

Возможное решение здесь ...

0 голосов
/ 14 декабря 2010

В чистом TSQL единственная похожая вещь, о которой я могу подумать, - это скалярный UDF, который возвращает желаемую вейл.

В LINQ to SQL вы можете отображать элементы как перечисления c # / .NET, и он обрабатывает их для вас..

Но, если честно;в самом чистом TSQL я бы в основном использовал литералы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...