2011-07-04 2 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

'@ curPartiId'が' while'ループ(* shudder *)または 'cursor'ループ(* double shudder *)の中で設定されていない限り、マルチ行演算また、 –

+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 

詳細情報:

我々は、すべての組み合わせを含む真理値表を使用することができ、これを確認するには4つの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を組み合わせるときは常に括弧を使用することを強くお勧めします。 2番目のものについては、これがどのような言語であるのかはわかりませんが、T-SQLで同様のことをすることはできませんでした。試した実際のコード行を投稿できますか? –

+0

2005年に私の魅力のように働いて、面白い+1 –

関連する問題