Хранимая процедура для изменения битового флага, не может использовать Enums, так как многие приложения будут изменять его, что мне делать? - PullRequest
0 голосов
/ 05 декабря 2008

В базе данных есть столбец типа INT (Sql server).

Это значение int используется в битовом флаге, поэтому я буду использовать AND и OR.

Мне нужно передать параметр в мой sproc, и этот параметр будет представлять определенный элемент флага.

Я бы обычно использовал перечисление и передавал представление int в sproc , но так как многие различные модули будут получать к нему доступ, для них всех не будет практичным иметь мое определение enum (если оно изменено, это будет головная боль, чтобы развернуть его.)

Так что, если я буду использовать «строку» или магическое число в качестве значения параметра, то в моем sproc я сделаю:

IF(@blah = 'approved')
BEGIN
      // bit banging here
END

Ответы [ 2 ]

2 голосов
/ 05 декабря 2008

Вы можете использовать строку и конструкцию CASE:

CREATE PROCEDURE BitBang(@Flag AS VARCHAR(50), @Id AS INT)
AS
BEGIN
  DECLARE @Bit INT

  SET @BIT = CASE @Flag
    WHEN 'approved'   THEN 16
    WHEN 'noapproved' THEN 16
    WHEN 'fooflag'    THEN 8
    WHEN 'nofooflag'  THEN 8
  END

  IF @Bit IS NOT NULL
  BEGIN
    IF LEFT(@Flag, 2) = 'no' 
    BEGIN
      UPDATE TheTable SET BitField = BitField & ~@Bit WHERE Id = @Id
    END
    ELSE
    BEGIN
      UPDATE TheTable SET BitField = BitField | @Bit WHERE Id = @Id
    END
  END
END
0 голосов
/ 05 декабря 2008

Почему бы не использовать старые 0 и 1 для флага? Он уже широко принят как битовый переключатель, и не было бы путаницы или ошибок в том, что означают 0 и 1. Если вы не говорите, что будет более 2 флагов и что более 1 флаг будет иметь одинаковое конечное значение

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