У меня сложный SP, который применяет несколько JOIN и поиск, а также включает сложные фильтры, такие как значения, разделенные запятыми, и т. Д. Вдобавок к этому мне нужно развернуть две сложные, но эффективные функции:
1. Динамическая сортировка, но я вижу ее ограниченность - вы знаете длинную / неуклюжую иерархию CASE, странно, что эксперты также согласны с тем, что это единственное «лучшее» решение, которое у нас есть:
Динамическая сортировка в хранимых процедурах SQL http://www.sqlteam.com/forum/topic.asp?TOPIC_ID=5942
В любом случае, я пока не ожидаю многого от этого.
2. Динамическая разбивка на страницы - то есть я хочу, чтобы SP мог возвращать только X записей (X = размер страницы), начиная с Y (Y = номер страницы). Надеюсь, у вас есть общее представление.
Чтобы было понятнее, я хочу использовать что-то доступное в MySQL и PostgreSQL:
[LIMIT { number | ALL }] [OFFSET number]
База данных: разбивка на страницы SQL? http://www.sql.org/sql-базаданных/postgresql/manual/query-limit.html
Странно, что такая простая и базовая функциональность НЕ доступна в SQL 2005+ .. или я ошибаюсь (я был бы рад это услышать :-))
Я знал два подхода, которые сочетают в себе компромисс между производительностью и сложностью:
[2.1] Использование функции «RowNumber ()» в SQL 2005 с последующим применением фильтра: (я использовал его раньше)
WHERE (Row BETWEEN (@PageIndex-1) * @PageSize +1 AND @PageIndex* @PageSize)
Но опять же, для этого необходимо создать временную таблицу или использовать предложение WITH. Это также объясняется в: Смещение строки в SQL Server
[2.2] Я нашел несколько новых способов. Один из них - использование
SET ROWCOUNT
http://www.4guysfromrolla.com/webtech/042606-1.shtml
И говорят, что в целом 2.2 эффективнее 2.1. Это? Кроме того, я хотел знать, что происходит, если два пользовательских запроса запускают один и тот же SP дважды одновременно. Я надеюсь, что «SET ROWCOUNT» не будет «совместно использоваться» или «перезаписываться» среди одновременных SP-вызовов. Пожалуйста, подтвердите. Есть ли какие-либо другие моменты по сравнению с 2.1 и 2.2?