У меня есть табличная функция sqlclr, у которой есть прототип, например
CREATE FUNCTION [dbo].[some_func]
(...)
RETURNS TABLE (
[order_id] INT NULL,
[value1] VARCHAR(50) NULL,
[value2] INT NULL
)
AS EXTERNAL NAME [some_db].[MyProject].[some_func]
Фактическая функция не имеет значения. Теперь я знаю, что моя функция всегда возвращает результаты в последовательном порядке на основе order_id.
Я использую эту функцию и присоединяю ее к таблице, которая проиндексирована по order_id, и когда я присоединяюсь к ним и смотрю на план, я вижу, что объединение вызвало разлив для выполнения сортировки.
Теперь я нашел эту статью, в которой говорилось, что я могу изменить прототип и указать порядок.
http://www.sqlskills.com/blogs/bobb/sql-server-2008-ordered-sqlclr-table-valued-functions/
Изменение прототипа вручную дает желаемый результат
CREATE FUNCTION [dbo].[some_func]
(...)
RETURNS TABLE (
[order_id] INT NULL,
[value1] VARCHAR(50) NULL,
[value2] INT NULL
)
ORDER(order_id asc)
AS EXTERNAL NAME [some_db].[MyProject].[some_func]
Эта версия func не требует сортировки, и в базе данных tempdb не происходит сброса данных. Однако мы регулярно развертываем наш проект sql через SSDT, и каждый раз, когда мы это делаем, он автоматически генерирует прототип. У меня нет возможности контролировать то, что будет установлено. Есть ли опция в моей функции cs, чтобы я мог указать, что результат some_func упорядочен?