SQLCLR静态类构造函数中的数据访问

时间:2011-04-16 11:33:12

标签: sql-server sqlclr

在SQL-CLR程序集中..
有没有一种方法可以加载某些数据,并且可能只在装配加载上读取数据库? 让我说我有一类用户定义的函数,这些函数使用一些正则表达式,必须根据我在DB中的一些表中的数据构建和编译,有没有一种方法可以从表中读取,创建我的Regex对象并在AppDomian的生命周期中保持这些对象的活着,这样每当调用任何使用这些对象的用户定义函数时,它就不必重建它们?

编辑:静态构造函数不是读取数据的有效上下文。

我希望我能够清楚地表达自己的意思,谢谢你。

2 个答案:

答案 0 :(得分:1)

  

是否有一种方法可以加载某些数据,并且可能只在装配加载上从数据库读取?

这取决于您对“特定数据”的位置和/或程序集的PERMISSION_SET的灵活程度。

如果程序集必须保持为SAFE(这是首选的,如果可能的话),那么只能从程序集外部读取的两个源是:

  • 环境变量
  • app.config文件(有关详细信息,请参阅我对此S.O.问题的回答:Does SQL Server CLR Integration support configuration files? - 是的,它也适用于appSettings部分。 更新:到目前为止,似乎从配置文件中读取不适用于Linux(从SQL Server 2017开始的新平台)。

虽然这些都不是“动态”的,例如从该表中读取,但是可以在该设置表上设置触发器以将适当的数据写出到 sqlservr.exe.config 文件。我不会为高度事务性的表推荐这个,但我在此假设为此目的的值并没有经常改变,特别是因为计划是在static readonly类变量中缓存它们。

如果程序集已设置为EXTERNAL_ACCESS,那么您可以定期/外部SqlConnection从数据库获取数据。但是,如果这是唯一的原因,您将程序集设置为EXTERNAL_ACCESS,那么我会选择上面提到的配置文件选项,因为如果程序集是,则确定性方法的性能更好设为SAFE

答案 1 :(得分:0)

我认为不同SQL服务器版本之间的行为有所改变,但静态构造函数可能有所帮助:http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx