(у меня недостаточно репутации, чтобы комментировать, по-видимому, поэтому я отвечаю здесь)
В ответ на:
Знаете ли вы, как я мог бы избежать использования sp_executesql? Я слышал, что если вы используете
что тогда он не может кешировать план запроса. - Бреннан 28 апреля в 0: 16
На самом деле, в большинстве случаев sp_executesql позволяет кэшировать план запроса так же, как и хранимую процедуру.
Хитрость заключается в том, чтобы использовать параметризованный динамический sql, например:
exec sp_executesql N'select from MyTable where myId = @id', N'@id int', @id;
Таким образом, вы выполняете тот же запрос, просто подставляя в @id, как в случае с хранимой процедурой. В динамическом sql план запроса кэшируется на основе строкового значения запроса (первый параметр sp_executesql).
Единственный вопрос, который я хотел бы задать, - почему вы должны отсортировать это в базе данных? Я чувствую, что вы должны сортировать это позже ...
Однако, поскольку выражение и направление сортировки НЕ могут быть параметризованы (они должны быть объединены прямо в строку запроса), вы получите отдельный план запроса, кэшированный для каждого выражения и направления сортировки. Это, вероятно, не имеет большого значения.
EDIT:
Вот ссылка, объясняющая, как планы динамического SQL-запроса кэшируются .