Дублирование кода с существует - PullRequest
1 голос
/ 25 августа 2011

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

IF EXISTS(SELECT a, b, c 
          FROM table
          WHERE d = 2)
    BEGIN
        SELECT a, b, c
        FROM TABLE
        WHERE d = 2
    END
ELSE
    BEGIN
        SELECT 'EMPTY'
    END

Есть ли хороший способ переписать вышеприведенное, чтобы выбор не дублировался?

Edit: Спасибо за ответы до сих пор. Похоже, консенсус заключается в том, что приложения-потребители должны быть изменены, но, к сожалению, я не контролирую эти приложения.

Что касается ответов о том, что это опасно, поскольку выбор или существование могут быть изменены независимо от другого, с которым я полностью согласен, и именно это побудило меня задать этот вопрос.

Ответы [ 2 ]

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

Просто выберите и исправьте приложение, чтобы оно не проверяло RS(0) = 'empty' - большинство языков приложений могут нормально работать с пустым набором результатов.Этот тип запроса является очень расточительным - не говоря уже о потенциально опасных (например, - кто-то редактирует часть EXISTS(), но забывает скопировать это изменение в фактическое SELECT, или наоборот).

1 голос
/ 25 августа 2011

К сожалению, я согласен с предыдущими постерами, что нет удовлетворительно хорошего способа сделать это.

Если ваша главная цель - устранить дублирующийся код, вы можете перейти к следующей схеме:

SELECT
  a,
  b,
  c
INTO #temp
FROM table
WHERE d = 2

IF @@ROWCOUNT = 0
BEGIN
  SELECT 'EMPTY'
END
ELSE
BEGIN
  SELECT * FROM #TEMP
END

DROP TABLE #TEMP;

Конечно, у этого решения есть свой потенциальный набор проблем, и я думаю, что вам будет гораздо лучше изменить приложение-потребитель, чтобы полностью устранить проблему.

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