SQL Server возвращает значение и проверяет, существует ли один и тот же оператор выбора (одна операция выбора) - PullRequest
0 голосов
/ 08 июня 2018

У меня есть стол с сотрудниками.Эта таблица имеет столбец (FlagActive), который имеет тип BIT и указывает, является ли сотрудник активным (1) или неактивным (0).

Например, чтобы упростить сценарий, таблица будет иметь вид:

Id |EmployeeName |FlagActive

У меня есть хранимая процедура, которая проверяет, есть ли сотрудник в таблице.Если существует, он делает некоторые вещи.В противном случае это делает другие вещи.Поэтому я делаю следующее:

DECLARE @IsActive BIT
SELECT @IsActive = FlagActive FROM Employees WHERE Id = @IdEmployee

IF @IsActive  = 1 
BEGIN
     -- Employee is active: Do some stuff
END
ELSE
BEGIN
    -- Employee is inactive: Do some stuff
END

Это хорошо работает, если сотрудник всегда существует в таблице, но если в случае сотрудника не существует в таблице, @IsActive = 0 выполняется, и выполняется ELSE body.Это неверно: если сотрудника не существует, ничего не следует делать.

Тогда я попытаюсь сделать следующее:

IF EXISTS(SELECT TOP 1 * FROM Employees WHERE Id = @IdEmployee)
BEGIN
   DECLARE @IsActive BIT    
   SELECT @IsActive = FlagActive FROM Employees WHERE Id = @IdEmployee

   IF @IsActive  = 1 
   BEGIN
       -- Employee is active: Do some stuff
   END
   ELSE
   BEGIN
       -- Employee is inactive: Do some stuff
   END
END

Проблема с этим подходом заключается в том, что мне нужно сделать 2 операции: сначала выберите, чтобы проверить, существует ли сотрудник, и второй (когда я знаю, что сотрудник существует в таблице), чтобы проверить, является ли сотрудник активным или неактивным.

Я хотел бы выполнить эти две операции в операции выбора (тот же выбор)и избегайте двух операций выбора.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018
--You could change your IF Exists to just a select Active where employeeId = Id , 
--if it is NULL they don't exist, else select the active value.

 DECLARE @isActive BIT

--Instead of IF EXISTS, just set the BIT value to whatever is returned,
--If NULL they don't exist
SET @isActive =  SELECT TOP 1 [FlagActive] FROM Employees WHERE Id = @IdEmployee

   IF @isActive IS NOT NULL
   BEGIN

       IF @IsActive  = 1 
       BEGIN
          -- Employee is active: Do some stuff
       END
       ELSE
       BEGIN
          -- Employee is inactive: Do some stuff
       END
   END
0 голосов
/ 08 июня 2018

Попробуй поменять еще что-нибудь так:

ELSE IF @IsActive = 0 AND @IsActive IS NOT NULL
BEGIN
     -- Employee is inactive: Do some stuff
END
...