2011-07-04 52 views
1

我有一个用户函数返回一个BIT calle dbo.IsPartReady。 我试图使用触发器内部的功能如下:SQL Server:使用TSQL变量时出错

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'。

我在做什么错?

+0

局部变量的声明?请显示代码 – heximal

+1

除非在'while'循环(* shudder *)或'cursor'循环(* double shudder *)中设置了'@ curPartiId',否则很可能触发器在多行操作中被破坏也。 –

+1

达成一致的达米安(+1),除非没有太大的差别(所以不知道为什么你不同地颤抖)。 while循环只是一个没有DECLARE CURSOR的游标。 –

回答

4

SQL Server中的BIT数据类型不是布尔值,而是整数。您必须将变量的值与某个值进行比较以获取布尔表达式。 BIT可以具有值0,1或NULL。 http://msdn.microsoft.com/en-us/library/ms177603.aspx

declare @B bit = 1 

if @B = 1 
begin 
    print 'Yes' 
end 
3

使用以下:

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

或替代,

IF ((@railReady & @frameReady) | (@dryAReady & @dryBReady)) = 1 

的更多信息:

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

WITH B(x) AS (SELECT CAST(0 AS bit) UNION ALL SELECT CAST(1 AS bit)) 
, AllSixteenCombinations(a,b,c,d) AS 
    (SELECT * FROM B B1 CROSS JOIN B B2 CROSS JOIN B B3 CROSS JOIN B B4) 
SELECT a,b,c,d 
, CASE WHEN ((a = 1 AND b = 1) OR (c = 1 AND d = 1)) THEN 'Y' ELSE 'N' END[Logic] 
, CASE WHEN ((a & b) | (c & d)) = 1 THEN 'Y' ELSE 'N' END [Bitwise] 
FROM AllSixteenCombinations 

输出:

以何种方式
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) 
+0

对于第一个示例,强烈建议在合并AND和OR时始终使用括号。对于第二种,我不确定这是什么语言,但我当然无法在T-SQL中获得类似的工作。你能发布你尝试过的代码的实际工作线吗? –

+0

在2005年就像我的魅力一样,有趣的+ 1 –