SQL Server: ошибка при использовании переменных TSQL - PullRequest
1 голос
/ 04 июля 2011

У меня есть пользовательская функция, которая возвращает вызов BIT 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'.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

Тип данных BIT в SQL Server не является логическим, это целое число. Вы должны сравнить значение переменной с чем-то, чтобы получить логическое выражение. 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 голосов
/ 04 июля 2011

Используйте следующее:

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)
...