SQL Server "ярлык" обработка - PullRequest
       22

SQL Server "ярлык" обработка

0 голосов
/ 21 сентября 2018

Вот упрощенная версия проблемы, которую я пытаюсь решить.

У меня есть временная таблица #MyData с двумя столбцами: description и value.

У меня также есть таблицы MyRuleSequenceCollection, MyRuleSequence и MyRule, которые я хочу использовать для оценки данных во временной таблице.MyRuleSequence - это упорядоченный список MyRule записей, а MyRuleSequenceCollection - неупорядоченный набор MyRuleSequence записей.

Одна из последовательностей ищет записи во временной таблице с описаниями "A" и«B», затем пытается разделить A на B. Первое правило проверяет наличие A, если его там нет, процесс должен остановиться.Второе правило проверяет наличие B, если его там нет, процесс должен остановиться.Третье правило проверяет, что B не равно 0, если это 0, процесс должен остановиться.Наконец, 4-е правило делит A на B и проверяет, больше ли результата 1.

Временная таблица содержит:

A  20
B  5

Результат: все 4 оцененных правила, окончательный результат true

Временная таблица содержит:

A   20
B   0

Результат: выполняется только первые 3 правила, ошибка без деления на 0, окончательный результат false

Временная таблица содержит:

B   20
C   5

Результат: запускается только первое правило, конечный результат - ложь

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

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

Обновление: несколько дней без предложений и предложений.У кого-нибудь есть мнение об использовании CTE для этого?Или это просто курсор с обработкой освобождения для вас?

1 Ответ

0 голосов
/ 29 сентября 2018

Иногда действительно нет другого выбора, кроме использования курсора базы данных.

Так вот, что я и сделал.Это работает, и производительность и использование ресурсов разумны.Это пожарная пересылка, только локальная статика, не блокирующая все остальное, что я мог придумать, чтобы ускорить работу курсора, и если позже у меня возникнут проблемы с производительностью, я могу выделить несколько соединенных / псевдонимных таблиц (3 таблицы оставляются объединенными / псевдонимами 10 раз)в табличную переменную и используйте ее в курсоре для дальнейшего ускорения.

Мне остается удивляться, почему автоматическое неприятие курсоров настолько сильно, даже в случае, когда нет прагматичной альтернативы.

...