Возврат различных значений на основе выбранных данных - PullRequest
3 голосов
/ 12 января 2012

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

CREATE PROCEDURE GetStuffById
@StuffId int
AS
BEGIN
IF EXISTS (SELECT TOP 1 * FROM [Stuff] WHERE StuffId = @StuffId)
    BEGIN
    DECLARE @IsValid bit
    SET @IsValid = (SELECT IsValid FROM [Stuff] WHERE StuffId = @StuffId)
    IF @IsValid = 1
        BEGIN
        --More nested checks may occur here
        SELECT * FROM [Stuff] WHERE StuffId = @StuffId
        END
    ELSE
        BEGIN
        RETURN -2
        END
    END
ELSE
    BEGIN
    RETURN -1
    END
END

В этом подходе у меня уже есть 3 выбора на одной и той же таблице, что кажется избыточным и неэффективным, а другая проверка будет означать другой выбор и т. Д. Есть ли лучший шаблон для этого (например, временные таблицы)?

ОБНОВЛЕНИЕ: отредактированная первая проверка

1 Ответ

4 голосов
/ 12 января 2012

Вы можете назначить несколько переменных в одном выделении и использовать @@ROWCOUNT, чтобы определить, была ли найдена строка.

DECLARE @IsValid BIT,
        @Foo     INT

SELECT @IsValid = IsValid,
       @Foo = Foo
FROM   [Stuff]
WHERE  StuffId = @StuffId

/*This must be tested immediately after the assignment statement*/
IF @@ROWCOUNT = 0
  RETURN -1

IF ISNULL(@IsValid, 0) = 0
  RETURN -2

SELECT @IsValid AS IsValid,
       @Foo     AS Foo  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...