背景:
Visual Studio 无法部署数据库项目。它试图删除已经引用的函数(例如在检查约束中),而不是仅仅添加新函数并更新现有函数,因此部署总是失败。
因此,我正在编写自己的代码来更新程序集并添加/更新任何功能。
我假设编译器/部署器使用反射和 SqlFunction 属性的属性,所以我也使用反射来收集具有 SqlFunction 属性的静态方法的 MethodInfo 列表。
问题/任务:
我需要知道如何将 SqlFunctionAttribute 的属性(例如 IsDeterministic、DataAccess、Name、IsPrecise 等)和函数的方法签名转换为适当的 T-SQL“CREATE FUNCTION”语句。
我已经发现没有帮助的现有信息:
“创建函数”的文档令人困惑且不完整。在底部,它最后提到了一些 SqlFunction 属性,如 IsDeterministic,但它谈论它们就像它们是 C# 属性,而不是 T-SQL 参数,所以我不知道如何在创建函数语句中使用它们。
//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' ;