Значения 'TRUE' и 'FALSE' являются специальными строками, которые можно неявно преобразовать в переменные типа bit.Этот фрагмент взят из документации MSDN для бита .
Строковые значения TRUE и FALSE могут быть преобразованы в битовые значения: TRUE преобразуется в 1, а FALSE преобразуется в 0.
Обратите внимание, что эти значения, похоже, не чувствительны к регистру.
Именно поэтому предложение where во втором фрагменте кода работает (я предполагаю, что поле определено как бит).
select * from table where field='true'
Без указания целевого типа бита, TRUE и FALSE больше не рассматриваются как специальные значения и остаются простыми строковыми значениями.Вот почему приведение было необходимо в вашем третьем фрагменте.
select cast('true' as bit) as somefield,...
MSDN сообщает , что битовые литералы (или константы, как они там упоминаются) - это числа 0 и 1.
битовые константы представлены числами 0 или 1 и не заключены в кавычки.Если используется число больше единицы, оно преобразуется в единицу.
В некоторых случаях эта информация может помочь, но помните, что литеральные значения 0 и 1 интерпретируются как числа, а не как биты.Следующие операторы оба возвращают int, что демонстрирует это.
select sql_variant_property(0, 'BaseType')
select sql_variant_property(1, 'BaseType')