TSQL触发器中使用cursor:AND运算符(值为1和0)的意外行为计算为true

TSQL触发器中使用cursor:AND运算符(值为1和0)的意外行为计算为true,tsql,triggers,cursor,bit,logical-operators,Tsql,Triggers,Cursor,Bit,Logical Operators,我一直在尝试调试触发器生成的一些有问题的数据库事务,在单步执行T-SQL时遇到了意外的结果。在通过FETCH NEXT from Updated_cursor从游标获取值后,我输入一个while循环,然后对从游标获取的每一行计算两个变量,以确定在进行如下处理后是否进行插入: WHILE @@FETCH_STATUS = 0 BEGIN IF (@first_indicator > 0 AND @second_indicator >0) BEGIN

我一直在尝试调试触发器生成的一些有问题的数据库事务,在单步执行T-SQL时遇到了意外的结果。在通过
FETCH NEXT from Updated_cursor
从游标获取值后,我输入一个while循环,然后对从游标获取的每一行计算两个变量,以确定在进行如下处理后是否进行插入:

WHILE @@FETCH_STATUS = 0
BEGIN
      IF (@first_indicator > 0 AND @second_indicator >0)
      BEGIN
              --processing and insert occurs here

在调试模式下,逐步查看代码,我可以看到当
@first_indicator=1
@second_indicator=0
的值时,该条件的计算结果为true,这对我来说没有意义。这会导致插入重复和错误的行。这两个变量是
数据类型,我觉得这可能是相关的,但我不知道为什么会发生这种情况。

将代码从光标中拉出时,如下所示:

DECLARE @f BIT = 1
DECLARE @s BIT = 0

IF(@f>0 AND @s>0) PRINT 'GH';
它按预期工作,不打印。您确定在执行if语句的正确时间查看了正确的变量吗


此外,您在评论中提到的两个
IF
语句并不相同。因此,我不能确切地确定您的实际问题是什么。

当您将代码从光标中拉出时,如下所示:

DECLARE @f BIT = 1
DECLARE @s BIT = 0

IF(@f>0 AND @s>0) PRINT 'GH';
它按预期工作,不打印。您确定在执行if语句的正确时间查看了正确的变量吗


此外,您在评论中提到的两个
IF
语句并不相同。因此,我不能确切地确定您的实际问题是什么。

好吧,您的代码有
第二个指示符
,您的“查看时的值”是
第二个指示符
(缺少
a
)。。。如果这不是一个输入错误,那么你有两个不同的变量。OT:但尽量不要在触发器中使用游标,100次中有99次是完全错误的。此外,当条件从:
if(@first\u indicator>0和@second\u indicator>0)更改为:
if(@first\u indicator=1和@second\u indicator=1)时,问题得到了解决
修复了这个问题,但我仍然想知道T-SQL是怎么做的,它打破了第一次评估。游标并不是天生就坏的:它们经常使用的是坏的。如果我也有的话,我会用的。但出于某种原因,我几乎总能找到一种基于集合的方式。是:在封面下,SQL引擎运行循环。好的,您的代码有
第二个指示符
,您的“查看时的值”是
第二个指示符
(缺少
a
)。。。如果这不是一个输入错误,那么你有两个不同的变量。OT:但尽量不要在触发器中使用游标,100次中有99次是完全错误的。此外,当条件从:
if(@first\u indicator>0和@second\u indicator>0)更改为:
if(@first\u indicator=1和@second\u indicator=1)时,问题得到了解决
修复了这个问题,但我仍然想知道T-SQL是怎么做的,它打破了第一次评估。游标并不是天生就坏的:它们经常使用的是坏的。如果我也有的话,我会用的。但出于某种原因,我几乎总能找到一种基于集合的方式。是:在封面下,SQL引擎运行循环。在我更正输入错误之前,您可能已经看到了第二条评论。他们现在应该有两个相等的变量。我确信我看到的是正确的值,但当我按照您的建议将语句放在单独的查询中时,我可以看到它的计算结果与预期一致,因此我不再确定发生了什么,也不确定我的原始问题是否有效。在我更正输入错误之前,您可能已经看到了第二条注释。他们现在应该有两个相等的变量。我确信我看到的是正确的值,但当我按照您的建议将语句放在单独的查询中时,我可以看到它的计算结果与预期一致,因此我不再确定发生了什么,也不确定我最初的问题是否有效。