T-SQL中的'NOT'布尔值不能处理'bit'数据types?

试图执行一个布尔NOT操作,似乎在MS SQL Server 2005下,下面的块不起作用

DECLARE @MyBoolean bit; SET @MyBoolean = 0; SET @MyBoolean = NOT @MyBoolean; SELECT @MyBoolean; 

相反,我越来越成功

 DECLARE @MyBoolean bit; SET @MyBoolean = 0; SET @MyBoolean = 1 - @MyBoolean; SELECT @MyBoolean; 

然而,这看起来有点扭曲的方式来expression一些简单的否定。

我错过了什么吗?

使用〜运算符:

 DECLARE @MyBoolean bit SET @MyBoolean = 0 SET @MyBoolean = ~@MyBoolean SELECT @MyBoolean 

你的解决scheme是一个很好的…你也可以使用这个语法在SQL中切换一点…

 DECLARE @MyBoolean bit; SET @MyBoolean = 0; SET @MyBoolean = @MyBoolean ^ 1; SELECT @MyBoolean; 

从1减去这个值看起来好像能做到这一点,但就expression意图而言,我认为我更喜欢这样做:

 SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END 

这是更详细的,但我认为这是更容易理解。

在SQL 2005中没有一个真正的布尔值,位值是真的。

一个位可以有三个状态,1,0和null(因为它是数据)。 SQL不会自动将它们转换为true或false(尽pipeSQL企业pipe理器会令人困惑)

在逻辑中考虑位字段的最好方法是作为1或0的整数。

如果直接在位字段上使用逻辑,它的行为将与其他任何值variables一样 – 即如果逻辑具有值(任何值),则逻辑将为真,否则为逻辑。

要分配一个倒数位,您需要使用按位NOT运算符。 当使用按位NOT运算符'〜'时,您必须确保您的列或variables被声明为一位。

这不会给你零:

 Select ~1 

这会:

 select ~convert(bit, 1) 

那么这样做:

 declare @t bit set @t=1 select ~@t 

BIT是一个数字数据types,不是布尔值。 这就是为什么你不能应用布尔运算符。
SQL Server没有BOOLEAN数据types(不确定SQL SERVER 2008),所以你必须坚持像@Matt Hamilton的解决scheme。

使用ABS获取绝对值(-1变成1)…

 DECLARE @Trend AS BIT SET @Trend = 0 SELECT @Trend, ABS(@Trend-1)