SQL Server Insert с использованием оператора case, чтобы не возвращать строки - PullRequest
1 голос
/ 30 апреля 2020

Мне было интересно, можно ли написать вставку с использованием довольно сложной логики регистра c, но не вставлять строки, если ни один из предикатов регистра не имеет значения true. Это также означает, что я не хочу вставлять ноль. Случай выбора не будет извлекать данные из таблицы

например,

DECLARE @tabErrors TABLE (errorMessage NVARCHAR(100))
DECLARE @intType INT
DECLARE @intVal INT

INSERT @tabErrors
SELECT CASE 
   WHEN @intType = 1 AND @intVal > 100
      THEN 'Some Error'
   WHEN @intType = 2 AND @intVal > 200
      THEN 'Some Other Error'
   ELSE <NO ROWS> END

IF SELECT COUNT(*) FROM @tabErrors = 0
   -- Continue with processing

К сожалению, я не могу изменить утверждение, проверяющее счет (т.е. поместить в где errorMessage IS NOT NULL)

Есть ли способ сделать это или я должен прибегнуть к разделению дела на несколько операторов if?

1 Ответ

4 голосов
/ 30 апреля 2020

A CASE выражение (операторы Case (Switch) не существуют в T- SQL) возвращает скалярное значение, оно не контролирует, сколько строк возвращает SELECT, если вы Если вы хотите контролировать возврат строки, вам нужно сделать это в WHERE:

SELECT CASE WHEN @intType = 1 AND @intVal > 100 THEN 'Some Error'
            WHEN @intType = 2 AND @intVal > 200 THEN 'Some Other Error'
       END AS YourAlias
WHERE (@intType = 1 AND @intVal > 100)
   OR (@intType = 2 AND @intVal > 200);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...