Как указать, что функция с табличным значением SQLCLR упорядочена?

У меня есть табличная функция 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 упорядочен?


person Michael B    schedule 23.02.2017    source источник


Ответы (1)


К сожалению, нет, у SSDT нет механизма (т. е. такого атрибута, как SqlFacet) для поддержки этой опции (или некоторых других). Ваши варианты:

  1. Создайте сценарий SQL после развертывания, чтобы выполнить оператор ALTER FUNCTION именно таким, каким вы хотите его видеть. Просто добавьте скрипт SQL в свой проект и установите для его «Build Action» значение «PostDeploy».

  2. Создайте DDL (т.е. CREATE FUNCTION...) самостоятельно и используйте «событие после сборки» (в разделе «Свойства проекта | События сборки») для выполнения SQL через SQLCMD.

  3. Создайте свой собственный атрибут, которым вы можете пометить функцию, а затем создайте участника развертывания ("Действие сборки" = "Конфигурация расширения развертывания"). Это позволило бы обрабатывать его в режиме реального времени через SSDT, но, похоже, это немалая работа.

Другие параметры, не поддерживаемые через SSDT (пожалуйста, проголосуйте за их поддержку по следующим ссылкам :-):

Из-за всех этих неподдерживаемых опций я редко использую SSDT для фактического развертывания, а когда я это делаю, я использую SQL-скрипты после развертывания для выполнения операторов ALTER (хотя они не являются динамическими, поэтому было бы лучше, чтобы их поддерживали). через атрибут в коде). В большинстве случаев я просто использую свой собственный сценарий развертывания ( .CMD ), который запускаю как событие после сборки.


P.S. Я отправил предложение Microsoft Connection для этой конкретной функции:
SSDT — ЗАКАЗ ПОДДЕРЖКИ предложение для SQLCLR TVF через атрибут SqlFunction при создании сценариев SQL публикации и создания

person Solomon Rutzky    schedule 23.02.2017
comment
Немного грустно, но да, я могу использовать шаг функции alter. - person Michael B; 23.02.2017