Возвращать результат запроса select, только если он не пустой - PullRequest
2 голосов
/ 22 августа 2011

Работа с Sql Server. Написание хранимой процедуры. Вот псевдокод того, чего я хочу достичь:

    IF EXISTS ( SELECT  field1
                FROM    t1
                WHERE   field1 = ... AND field2 = ...) 
        BEGIN
            SELECT  field1
                FROM    t1
                WHERE   field1 = ... AND field2 = ...
        END

Есть ли лучший способ сделать это? Любая помощь приветствуется.

Chirayu

Обновление: проблема в том, что один и тот же запрос выполняется дважды. Я также не могу просто выполнить запрос на выполнение и вернуть ноль (если результат нулевой, я бы хотел вернуть альтернативный результат).

Ответы [ 4 ]

3 голосов
/ 22 августа 2011

Вы можете проверить @@ ROWCOUNT после однократного выполнения запроса, чтобы определить, возвращать ли значение:

http://msdn.microsoft.com/en-us/library/ms187316.aspx

2 голосов
/ 19 сентября 2012

Я сделал это перед использованием CTE и табличной переменной, для этого требуется больше строк кода, но запрос пишется только один раз, поэтому ваша логика существует в одном месте.

DECLARE @Results TABLE (Result INT);
WITH ResultsCTE AS
(
    --Your query goes here 
    SELECT  1 as Result 
    WHERE 1 = 1
)
INSERT INTO @Results
SELECT Result
FROM ResultsCTE

IF (SELECT COUNT(*) FROM @Results) > 0
BEGIN
    SELECT * FROM @Results
END
ELSE BEGIN
    SELECT 'Do Something Else or Do Nothing!'
END
2 голосов
/ 22 августа 2011

Хранимая процедура, которая иногда возвращает результат, хотя иногда это не было бы кошмаром для использования из любого API. API на стороне клиента имеет разные точки входа в зависимости от того, возвращаете ли вы набор результатов (SqlCommand.ExecuteReader) или он не возвращает набор результатов (SqlCommand.ExecuteNonQuery). Приложение не сможет заранее знать , какой API использовать! Инструменты моделирования используют опцию SET FMTONLY для анализа метаданных возвращенных наборов результатов, а инструменты моделирования очень запутаны, когда возвращаемый набор результатов начинает изменять форму случайным образом. Другими словами, вы идете по неверному пути, останавливайтесь и оборачивайтесь.

Просто запустите запрос, если строки не соответствуют вашим критериям, он просто вернет пустой набор результатов. Именно это ожидает каждый клиентский API и инструмент моделирования от вашей процедуры.

2 голосов
/ 22 августа 2011

Если выбор не дает никаких результатов, результаты не будут возвращены.Я не вижу никакой причины использовать условие здесь, если я что-то упустил ...

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