And*_*riy 6 sql-server sql-clr
在 SQL Server 中注册 DLL 后(在 Programmability -> Assemblies 中),我们可以从 SQL Server 中的 .NET 程序集中调用任何类型的方法吗?还是只是静态的?
SQLCLR 是一个非常有限的 CLR 主机。是的,您只能调用静态方法,因为应用程序域在所有会话之间共享(即@@SPID),因此任何“共享”实例或变量都非常不“线程安全”。应用程序域是在每个数据库、每个“所有者”上创建的(即,子句中列出的任何用户AUTHORIZATION
,CREATE ASSEMBLY
或者dbo
如果省略该子句则作为默认值),因此存在最小程度的分离,但对于任何给定的通过语句公开的方法CREATE {object} AS EXTERNAL NAME
,执行 SQLCLR 存储过程、函数、触发器或用户定义类型的任何会话中的任何用户都将访问完全相同的应用程序域。这就是为什么您也不允许在静态类变量中存储值(除非它们被标记为readonly
),因为它们在会话之间共享,并且一个会话可以覆盖另一个会话刚刚存储的值,因此您会变得奇怪/不稳定/不可预测行为。
关于 SQLCLR 是受限环境:
请参阅以下 MSDN 页面,了解SQLCLR 中不允许的内容的列表: CLR 集成编程模型限制。
请参阅以下 MSDN 页面,了解 SQLCLR 中包含的少数 .NET Framework 库的列表:支持的 .NET Framework 库。
有关一般使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上就此主题撰写的系列(需要免费注册才能阅读其内容,但这是值得的):SQLCLR 的阶梯。