print @T & @F
Возвращает 0
&
является побитовым оператором И
Оператор & bitwise выполняет побитовое логическое И между двумя выражениями, принимая каждый соответствующий бит для обоих выражений. Биты в результате устанавливаются в 1, если и только если оба бита (для текущего разрешаемого бита) во входных выражениях имеют значение 1; в противном случае бит в результате устанавливается в 0.
В вашем случае @T & @F
разрешает 1 & 0
и поэтому возвращает результат типа данных BIT
со значением0
При передаче PRINT
оператору этот bit
результат неявно приводится к строке, а результат выводится клиенту.
print @T and @F
Есть много плохого в этом.
AND
Объединяет два логических выражения и возвращает значение ИСТИНА, если оба выражения имеют значение ИСТИНА.
bit
не то же самое, что логическое. Они не являются взаимозаменяемыми, и SQL Server не будет неявно приведен bit
к логическому типу данных при необходимости (SQL Server не реализует логический тип данных SQL.).
Таким образом, вам нужно будет использовать выражение, как
@T = 'TRUE' AND @F = 'TRUE'
вместо того
@T and @F
Даже тогда ваши проблемы не закончились - все PRINT
равно не принимает логическое выражение. Вы можете использовать выражение, CASE
как показано ниже.
PRINT CASE
WHEN (@T = 'TRUE' AND @F = 'TRUE') THEN 'True'
WHEN NOT (@T = 'TRUE' AND @F = 'TRUE') THEN 'False'
ELSE 'Unknown' -- SQL uses three valued logic
END