Sql server SQL Server:使用TSQL变量时出错

Sql server SQL Server:使用TSQL变量时出错,sql-server,tsql,sql-server-2008,triggers,Sql Server,Tsql,Sql Server 2008,Triggers,我有一个用户函数,它返回一个名为dbo.IsPartReady的位。 我正在尝试使用触发器内部的函数,如下所示: SET @railReady = dbo.IsPartReady(1,@curPartiId); SET @frameReady = dbo.IsPartReady(2,@curPartiId); SET @dryAReady = dbo.IsPartReady(3,@curPartiId); SET @dryBReady = dbo.IsPartReady(4,@curPartiI

我有一个用户函数,它返回一个名为dbo.IsPartReady的位。 我正在尝试使用触发器内部的函数,如下所示:

SET @railReady = dbo.IsPartReady(1,@curPartiId);
SET @frameReady = dbo.IsPartReady(2,@curPartiId);
SET @dryAReady = dbo.IsPartReady(3,@curPartiId);
SET @dryBReady = dbo.IsPartReady(4,@curPartiId);

IF ( (@railReady AND @frameReady ) OR ( @dryAReady AND @dryBReady ) )
我在IF语句中遇到以下错误: 在预期条件的上下文中指定的非布尔型表达式,靠近“AND”


我做错了什么?

SQL Server中的位数据类型不是布尔值,而是整数。您必须将变量的值与某个值进行比较,才能得到布尔表达式。位的值可以是0、1或NULL。


SQL Server中的位数据类型不是布尔值,而是整数。您必须将变量的值与某个值进行比较,才能得到布尔表达式。位的值可以是0、1或NULL。

使用以下命令:

IF ((@railReady = 1 AND @frameReady = 1) OR (@dryAReady = 1 AND @dryBReady = 1))
或者

IF ((@railReady & @frameReady) | (@dryAReady & @dryBReady)) = 1
更多信息:

为了验证这一点,我们可以使用包含四位值的所有组合的真值表:

输出:

a     b     c     d     Logic Bitwise
----- ----- ----- ----- ----- -------
0     0     0     0     N     N
0     1     0     0     N     N
0     0     1     0     N     N
0     1     1     0     N     N
1     0     0     0     N     N
1     1     0     0     Y     Y
1     0     1     0     N     N
1     1     1     0     Y     Y
0     0     0     1     N     N
0     1     0     1     N     N
0     0     1     1     Y     Y
0     1     1     1     Y     Y
1     0     0     1     N     N
1     1     0     1     Y     Y
1     0     1     1     Y     Y
1     1     1     1     Y     Y

(16 row(s) affected)
使用以下命令:

IF ((@railReady = 1 AND @frameReady = 1) OR (@dryAReady = 1 AND @dryBReady = 1))
或者

IF ((@railReady & @frameReady) | (@dryAReady & @dryBReady)) = 1
更多信息:

为了验证这一点,我们可以使用包含四位值的所有组合的真值表:

输出:

a     b     c     d     Logic Bitwise
----- ----- ----- ----- ----- -------
0     0     0     0     N     N
0     1     0     0     N     N
0     0     1     0     N     N
0     1     1     0     N     N
1     0     0     0     N     N
1     1     0     0     Y     Y
1     0     1     0     N     N
1     1     1     0     Y     Y
0     0     0     1     N     N
0     1     0     1     N     N
0     0     1     1     Y     Y
0     1     1     1     Y     Y
1     0     0     1     N     N
1     1     0     1     Y     Y
1     0     1     1     Y     Y
1     1     1     1     Y     Y

(16 row(s) affected)

局部变量是以哪种方式声明的?请显示代码,除非@curpartid设置在while循环抖动或游标循环双重抖动中,否则很可能您的触发器也会因多行操作而中断。同意Damien+1,但没有太大差异,因此不确定为什么会有不同的抖动。while循环只是一个没有声明游标的游标。用哪种方式声明局部变量?请显示代码,除非@curpartid设置在while循环抖动或游标循环双重抖动中,否则很可能您的触发器也会因多行操作而中断。同意Damien+1,但没有太大差异,因此不确定为什么会有不同的抖动。while循环只是一个没有声明游标的游标。对于第一个示例,我强烈建议在组合AND和OR时始终使用括号。对于第二个问题,我不确定这是什么语言,但我肯定无法在t-SQL中得到任何类似的工作。您能发布您尝试过的实际工作代码行吗?2005年对我来说非常有吸引力,有趣+1对于您的第一个示例,我强烈建议在组合AND和OR时始终使用括号。对于第二个问题,我不确定这是什么语言,但我肯定无法在t-SQL中得到任何类似的工作。你能发布一行你尝试过的实际工作代码吗?在2005年对我来说非常有吸引力,有趣+1