我的任务是研究采用一些复杂的计算代码(在C#中)并将其移动到SQL Server 2012上的CLR函数中。计算的复杂性意味着将其写为经典的SQL SP或UDF并不是真的可行,因此使用CLR的想法 - 代码存在并经过测试。
我遇到的问题是计算使用的是使用EF6的数据层。显然,我会尽可能地为CLR函数提取现有代码的一小部分,但我仍然需要完成所有依赖项。
我的问题不是如何我可以这样做[后来会发生:)],而应该我这样做了吗?不知何故,将整个EF填充到我将访问以执行计算的数据库中感觉是错误的 - 感觉非常臃肿。
意见,建议,想法好吗?
由于
答案 0 :(得分:1)
除非有非常紧迫且特定需要保持代码库在应用层和此SQLCLR功能之间保持同步,否则我会说:
没有。这样做似乎没有太大的好处,如果有的话。它应该只需要一些数据点,并且使用SqlConnection
使用Context Connection = true;
来获取连接字符串(即进程内连接)非常容易获取这些数据点。
并且,考虑到性能是一个问题(因为它应该是,但仍然),因此开始关闭此SQLCLR路径的原因,添加允许的代码层和层中似乎适得其反对于易于使用的抽象层,即实体框架。
另外,为什么要从函数中获取数据而不是将其传递给函数?是否存在需要根据其特定值进行额外查找的值?通过将标量函数构造为确定性,您将获得相当多的性能:
IsDeterministic = true
属性中标记为SqlFunction
的标量SQLCLR函数将其输出缓存并映射到输入参数,以便可以查找它们(在其他行的上下文中)相同的查询)并重新使用,而不是再次运行该函数,
并行计划允许在IsDeterministic = true
属性中标记为DataAccess = DataAccessKind.Read
,AND 不标记为SqlFunction
的标量SQLCLR函数。如果IsDeterministic
未标记为true
或DataAccess
(或甚至SystemDataAccess
)被标记为Read
,则他们将像常规的T-SQL函数一样,它们会阻止任何使用它们的查询获得并行执行计划。