2012-01-12 6 views
3

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

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 выбирает по одной и той же таблицы, что кажется излишним и неэффективным и еще один чек будет означать другой выбора и т.д. Есть лучший шаблон для этого (например, временные таблицы)?

UPDATE: отредактированный первая проверка

+0

Зачем вам нужно различать пустую таблицу и не соответствующую строку? Выполняют ли другие проверки все значения из этой строки? –

+0

Вы можете использовать операторы sql «CASE ..... END CASE» в одном запросе, но это зависит от того, как это сделать. – VS1

+0

@MartinSmith Мой плохой, опустил предложение where, исправленное сейчас. И да, все проверки должны выполняться в одной строке (при условии, что она существует), но каждая проверка должна возвращать другой код ошибки. –

ответ

4

Вы можете назначить нескольких переменных в одном выбрать и использовать @@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 
+0

Действительно, это лучший подход, спасибо! –

+0

+1 Я просто печатал одно и то же решение. – Mack

Смежные вопросы