Как я могу использовать SqlFunctionAttribute в проекте базы данных, чтобы сгенерировать SQL для самостоятельного развертывания функций? Визуальная студия терпит неудачу - PullRequest
2 голосов
/ 20 апреля 2009

Справочная информация:

Visual Studio не удается развернуть проект базы данных. Он пытается отбросить функции, на которые уже есть ссылки (например, в проверочном ограничении), а не просто добавлять новые и обновлять существующие, поэтому развертывание всегда завершается неудачей.

В результате я пишу свой собственный код для обновления сборки и добавления / обновления любых функций.

Я предполагаю, что компилятор / развертыватель использует отражение и свойства атрибута SqlFunction, поэтому я также использую отражение для сбора списка MethodInfo статических методов, имеющих атрибут SqlFunction.

Вопрос / Задача:

Мне нужно знать, как преобразовать свойства SqlFunctionAttribute (например, IsDeterministic, DataAccess, Name, IsPrecise и т. Д.) И сигнатуру метода функции в соответствующий оператор T-SQL «CREATE FUNCTION».

Существующая информация, которую я уже нашел бесполезной:

Документация для 'create function' является запутанной и неполной. В конце он, наконец, упоминает некоторые свойства SqlFunction, такие как IsDeterministic, но говорит о них так, как будто они являются свойствами C #, а не параметрами T-SQL, поэтому я понятия не имею, как их использовать в операторе create function.

//CLR Functions
CREATE FUNCTION [ schema_name. ] function_name 
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type 
        [ = default ] } 
    [ ,...n ]
)
RETURNS { return_data_type | TABLE <clr_table_type_definition> }
    [ WITH <clr_function_option> [ ,...n ] ]
    [ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

Я бы ожидал, что параметр clr_function_option будет обрабатывать такие вещи, как IsDeterministic, но он не указан как опция.

Между тем, в документации для IBM DB2 я вижу подобные утверждения, которые не имеют ничего похожего в документации MSDN:

  CREATE FUNCTION countUp(INTEGER) 
  RETURNS INTEGER
  LANGUAGE CLR
  PARAMETER STYLE SQL
  SCRATCHPAD 10
  FINAL CALL
  NO SQL
  FENCED
  THREADSAFE
  NOT DETERMINISTIC
  EXECUTION CONTORL SAFE
  EXTERNAL NAME 'gwenUDF.dll:bizLogic.empOps!CountUp' ;

1 Ответ

2 голосов
/ 02 мая 2009

Я решил эту проблему в конце концов, после того, как понял, что SQL Server, обладающий самой сборкой, имеет доступ к значениям свойств SqlFunctionAttribute. В этом случае нет необходимости (и нет синтаксиса) указывать такие свойства в операторе T-SQL «CREATE FUNCTION».

Я создал утилиту для автоматического перечисления и развертывания функций и проверочных ограничений, которая работает следующим образом:

  1. Перечисляет все развертываемые статические методы в классах, которые я определяю, путем поиска функций с атрибутом SqlFunction с использованием отражения. Он также запускает запрос для перечисления всех существующих скалярных и табличных функций сборки, которые уже развернуты. Затем он объединяет эти списки в один список, где каждая функция либо существует, либо не существует. Есть кнопка для обновления сборки и кнопка для переключения существования каждой функции, что делает добавление / удаление / обновление функций БРИЗОМ.

  2. Кроме того, я добавил в интерфейс вторую вкладку для создания / включения / проверки / отключения проверочных ограничений. Я создал новый атрибут с именем SqlFunctionCheck, который можно применять несколько раз к функции. Атрибут имеет свойство «Таблица» и свойство «Поле», которые помогают утилите создавать проверочные ограничения. Он объединяет все проверки по таблице, создает проверку для каждой таблицы с именем «CK_» + table_name и создает выражение ограничения, объединяющее все вызовы метода с «и», передавая соответствующее имя поля для этой таблицы функции. Он отображает сгенерированное выражение ограничения, а также выражение ограничения, запрошенное с сервера sql, если ограничение уже существует.

IMO, это идеальное решение для использования SQL CLR Integration для обеспечения ограничений типов данных в Management Studio, запросов SQL в вашем коде и данных, используемых во всем коде из классов централизованных данных (ограничений).

Interface Screenshots and Relevant Function Headers

...