Как исправить выражение некулевого типа, указанное в контексте, где ожидается условие, рядом с ‘BEGIN’.?

#tsql

#tsql

Вопрос:

Привет, у меня есть этот запрос

 IF (select kmkood from or_arved_read where kmkood = '1' or kmkood = '14' or kmkood = '15' or kmkood = '6' )
    BEGIN
    SET @stat_vat = 21
IF (select kmkood from or_arved_read where kmkood = '2' or kmkood = '7' )
    SET @stat_vat = 12
  

Но оно возвращает An expression of non-boolean type specified in a context where a condition is expected, near 'BEGIN'.

как я могу это исправить?

Комментарии:

1. Если вы хотите проверить существование хотя бы одной записи, вы можете попробовать, ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ … )

2. Я хочу поставить @stat_vat = 21 where kmkood = 1 or 14 or 15 or 6 @sergiom

3. Является ли stat_vat полем таблицы or_arved_read ? Если это так, то вам нужен оператор UPDATE. В противном случае, если @stat_vat является переменной, то добавление EXISTS перед «(» исправит ваше выражение booelan .

Ответ №1:

Во-первых, у вас IF нет логического выражения. Подзапрос возвращает значение (или, точнее, для этого сценария вернет много и вызовет другую ошибку) для столбца kmkood , но тогда вы ничего не делаете с этим значением. Какое значение требуется для этого столбца? Формат должен быть примерно таким:

 IF (SELECT SomeColumn FROM dbo.SomeTable WHERE... ) = 'SomeValue' 
  

Кроме того, если у вас есть BEGIN , вам нужно END потом, которого у вас нет:

 IF (SELECT SomeColumn FROM dbo.SomeTable WHERE... ) = 'SomeValue'
BEGIN
    {Do several statements}
END
  

Поскольку, однако, вы просто выполняете SET оператор, тогда вам на самом деле не нужны операторы BEGIN and END .

Я подозреваю, что вы действительно ищете здесь, однако, в EXISTS :

 IF EXISTS(SELECT 1 FROM dbo.or_arved_read WHERE kmkood IN (1,14,15,6))
    SET @stat_vat = 21;

IF EXISTS(SELECT 1 FROM dbo.or_arved_read WHERE kmkood IN (2,7))
    SET @stat_vat = 12;
  

Вам также не нужны все эти OR s, an IN работает нормально, и числа не должны быть в одинарных кавычках, так что это немного упрощает задачу.