Как я могу принудительно установить тип данных вычисляемого столбца в битовое поле, которое не допускает нулевые значения? - PullRequest
12 голосов
/ 30 августа 2011

Я получил вычисляемый столбец, который должен быть битовым полем, вот пример формулы:

case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end

Тип данных вычисляемого столбца, заданного по этой формуле: int.

Каков наилучший способ принудительного ввода правильного типа данных?

С оператором CONVERT для всего случая тип данных bit, но Allow Nulls

CONVERT([bit], 
        case when (([some_field] < [Some_Other_field]) 
        then 0 
        else 1 
        end,
        0)

То же самое с оператором CONVERT для выражений результата, тип данных bit, но он Allow Nulls

case when (([some_field] < [Some_Other_field]) 
then CONVERT([bit], (0), 0) 
else CONVERT([bit], (1), 0) 
end

Или есть более разумный способ сделать это?

Ответы [ 2 ]

21 голосов
/ 30 августа 2011

Оберните определение вычисляемого столбца в ISNULL, указав в качестве второго аргумента все, что захотите (при условии, что он битовый или конвертируемый в такой).

Это один изнесколько мест, где вы должны использовать ISNULL, а не (как правило, лучше разработан) COALESCE.SQL Server имеет специальную логику, чтобы понять, что ISNULL с ненулевым вторым аргументом представляет ненулевой результат.

Например:

ISNULL(CONVERT(bit,case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end),0)

Это также можно использовать внапример, посмотреть определения.

11 голосов
/ 30 августа 2011

Если вы сохраните вычисляемый столбец, вы можете указать not null. http://msdn.microsoft.com/en-us/library/ms186241.aspx

CONVERT([bit], 
        case when (([some_field] < [Some_Other_field]) 
        then 0 
        else 1 
        end,
        0) PERSISTED NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...