Andriy Asked: 2017-03-11 06:49:05 +0800 CST2017-03-11 06:49:05 +0800 CST 2017-03-11 06:49:05 +0800 CST 我们可以从 SQL Server 中的 .NET 程序集调用哪些类型的方法 772 在 SQL Server 中注册一个 DLL 之后(在可编程性 -> 程序集),我们可以从 SQL Server 中的那个 .NET 程序集调用任何类型的方法吗?还是只是静态的? sql-server sql-clr 1 个回答 Voted Best Answer Solomon Rutzky 2017-03-11T07:01:43+08:002017-03-11T07:01:43+08:00 SQLCLR 是一个非常有限的 CLR 主机。是的,由于应用程序域在所有会话之间共享(即@@SPID),因此您只能调用静态方法,因此任何“共享”实例或变量都非常不“线程安全”。应用程序域是在每个数据库、每个“所有者”上创建的(即,AUTHORIZATION子句中列出的任何用户CREATE ASSEMBLY,或者dbo如果该子句被省略,则作为默认值),因此存在最小的分离量,但对于任何给定的通过CREATE {object} AS EXTERNAL NAME语句公开的方法,执行该 SQLCLR 存储过程、函数、触发器或用户定义类型的任何会话中的任何用户都将访问完全相同的应用程序域。这就是为什么您也不允许将值存储在静态类变量中(除非它们被标记为readonly) 因为它们在 Session 之间共享,并且一个 Session 可以覆盖另一个 Session 刚刚存储的值,因此你会得到奇怪的/不稳定的/不可预测的行为。 关于 SQLCLR 是受限环境: 请参阅以下 MSDN 页面以获取SQLCLR 中不允许的列表:CLR Integration Programming Model Restrictions。 请参阅以下 MSDN 页面以获取SQLCLR中包含的少数 .NET Framework 库的列表:支持的 .NET Framework 库。 有关一般使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上就此主题撰写的系列文章(需要免费注册才能阅读其内容,但这是值得的):Stairway to SQLCLR。
SQLCLR 是一个非常有限的 CLR 主机。是的,由于应用程序域在所有会话之间共享(即@@SPID),因此您只能调用静态方法,因此任何“共享”实例或变量都非常不“线程安全”。应用程序域是在每个数据库、每个“所有者”上创建的(即,
AUTHORIZATION
子句中列出的任何用户CREATE ASSEMBLY
,或者dbo
如果该子句被省略,则作为默认值),因此存在最小的分离量,但对于任何给定的通过CREATE {object} AS EXTERNAL NAME
语句公开的方法,执行该 SQLCLR 存储过程、函数、触发器或用户定义类型的任何会话中的任何用户都将访问完全相同的应用程序域。这就是为什么您也不允许将值存储在静态类变量中(除非它们被标记为readonly
) 因为它们在 Session 之间共享,并且一个 Session 可以覆盖另一个 Session 刚刚存储的值,因此你会得到奇怪的/不稳定的/不可预测的行为。关于 SQLCLR 是受限环境:
请参阅以下 MSDN 页面以获取SQLCLR 中不允许的列表:CLR Integration Programming Model Restrictions。
请参阅以下 MSDN 页面以获取SQLCLR中包含的少数 .NET Framework 库的列表:支持的 .NET Framework 库。
有关一般使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上就此主题撰写的系列文章(需要免费注册才能阅读其内容,但这是值得的):Stairway to SQLCLR。