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