Хорошо, я наконец-то нашел ответ на этот вопрос, благодаря @gbn, ваше решение определенно было правильным, учитывая мое первоначальное определение вопроса.
Однако оказывается, что я работал в ошибочном предположении, что следует избегать динамического SQL. Чтобы это работало, мне пришлось добавить вычисляемый (и проиндексированный) столбец со значением
CompanyName COLLATE [Collation_Name]
для каждого сопоставления, которое мне нужно было отсортировать (я понимаю, что в своем исходном вопросе я сказал, что не хочу изменять схему, но на самом деле я имел в виду, что не хочу перемещать существующие данные).
При выполнении следующего запроса
EXEC('SELECT TOP 10 * FROM dbo.Companies
WHERE CompanyName LIKE ''%searchstring%''
ORDER BY CompanyName COLLATE ' + @collation)
механизм запросов выбирает индекс для соответствующего вычисляемого столбца, и я получаю быстрый ответ. К сожалению, при использовании запроса, предоставленного @gbn, индексы, созданные для вычисляемых столбцов, игнорируются, что приводит к снижению производительности.
Это все очень удивляет меня, так как я всегда считал, что динамический SQL - это зло, которого следует избегать, если в этом нет крайней необходимости (т. Е. Когда ваш запрос изменяется так, что вы не можете параметризовать)