Что может быть лучше для обработки этой логики SQL? - PullRequest
2 голосов
/ 17 июля 2009

Внутри хранимой процедуры я заполняю таблицу элементов (#Items). Просто основная информация о них. Однако для каждого предмета мне нужно убедиться, что я могу продать его, и для этого мне нужно выполнить много проверок. Чтобы сохранить хранимую процедуру несколько удобной для обслуживания, я переместил логику в другую хранимую процедуру.

Каков наилучший способ вызова хранимой процедуры для каждого элемента в временной таблице?

Как у меня сейчас, я применяю столбец идентификаторов, а затем просто выполняю цикл while, выполняя хранимую процедуру для каждой строки и вставляя результат проверки во временную таблицу. (#Validation)

Однако теперь, когда эта логика изменилась, и между созданием #Items и выполнением цикла удаляются некоторые записи, что портит цикл while, поскольку Identity больше не равен счетчику.

Я мог бы справиться с этим, отбросив столбец идентификации и применив его перед циклом while, но мне было просто интересно, есть ли лучший способ. Есть ли способ получить определенную строку по индексу, если я применю предложение order by?

Я знаю, что могу сделать курсор, но это боль в заднице для меня. Кроме того, производительность вызывает некоторое беспокойство, будет ли быстрая перемотка курсора только для чтения лучшим вариантом, чем цикл while? Число строк в таблице #Items не так велико, может быть, не более 50, но хранимая процедура будет вызываться довольно часто.

Ответы [ 4 ]

3 голосов
/ 17 июля 2009
  1. Превратите вашу хранимую процедуру проверки в пользовательскую функцию, которая принимает идентификатор элемента или столбцы данных, необходимые для проверки записи элемента
  2. Создать временную таблицу
  3. Вставьте все свои вещи
  4. Напишите запрос на удаление для временной таблицы, которая вызывает ваш новый UDF, в предложении WHERE.
2 голосов
/ 17 июля 2009

Я согласен, что если вы можете сделать это на основе множеств, то делайте так. Возможно, поместите проверку в пользовательскую функцию вместо sproc, чтобы включить это. Который может проложит вам путь, чтобы вы могли сделать это на основе набора.

например.

SELECT * FROM SomeTable WHERE dbo.fnIsValid(dataitem1, dataitem2....) = 1

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

Исправление редактирования, основанное на понимании проблемы IDENTITY / loop: Вы можете использовать ROW_NUMBER () в SQL 2005 для получения следующей строки, не имеет значения, есть ли пробелы в поле IDENTITY, так как это назначит номер строки каждой записи в порядке, указанном вами: - получает следующую запись ВЫБРАТЬ ИЗ ( ВЫБРАТЬ ROW_NUMBER () НАД (ЗАКАЗАТЬ ПО IDField ASC) КАК RowNo, * FROM #temptable ) с ГДЕ s.RowNo = @ Counter

1 голос
/ 17 июля 2009

Действительно ли такая бизнес-логика должна быть в базе данных? Я не очень разбираюсь в вашем сценарии, но, может быть, было бы лучше перенести в приложение решение, которое вы пытаетесь смоделировать с помощью SP?

Таким образом, вы можете попытаться использовать функцию вместо хранимой процедуры для этой логики и включить результат этой функции в виде столбца во временную таблицу? Будет ли это работать для вас? Или, если вам нужны данные в реальном времени каждый раз, когда вы используете их позже, тогда функция, возвращающая значения 0/1, включенные в список выбора, может быть хорошей ставкой

0 голосов
/ 17 июля 2009

Если возможно переписать логику вашей хранимой процедуры с помощью запроса, i. е. подход, основанный на множестве?

Вы должны попробовать это в первую очередь.

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