启用SQL Server CLR集成后仍报10335错误,状态异常如何排查?
问题背景
在SSMS中创建CLR存储过程时触发错误:
Msg 10335,级别16,状态0,过程Usp_CreateGISEvent,第19行
[批处理起始行12]
公共语言运行时(CLR)以不支持的方式加载。
如果SQL Server中运行的扩展存储过程或OLE自动化对象在CLR集成运行时宿主加载CLR之前调用托管代码,就会发生此问题。您需要重启SQL Server才能使用CLR集成功能。
已执行以下语句启用CLR并重启SQL Server:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
但执行select * from sys.dm_clr_properties查询时,state值仍显示**"CLR is not loaded by SQL Server's CLR hosting code"**。
排查方向
检查启动时的CLR阻塞项
按错误提示,重点排查SQL Server启动阶段是否有提前调用托管代码的情况:- 查看是否有启动自动执行的作业、触发器或存储过程调用了OLE自动化(如
sp_OACreate系列) - 确认是否有第三方扩展存储过程在SQL Server启动时提前初始化了CLR
可通过SQL Server错误日志搜索CLR加载、OLE自动化相关的启动日志,定位异常触发点。
- 查看是否有启动自动执行的作业、触发器或存储过程调用了OLE自动化(如
验证CLR启用配置有效性
执行以下查询确认配置是否生效:SELECT name, value, value_in_use FROM sys.configurations WHERE name = 'clr enabled';确保
value_in_use为1,若仍为0,需检查实例是否处于单用户模式、是否受组策略限制,必要时执行RECONFIGURE WITH OVERRIDE强制生效。核对.NET Framework版本兼容性
SQL Server不同版本对.NET Framework有明确要求:- SQL Server 2012/2014:支持.NET 3.5/4.x
- SQL Server 2016+:仅支持.NET 4.x
确认本地.NET Framework版本匹配且未损坏,必要时修复.NET Framework安装。
检查SQL Server服务账户权限
SQL Server服务账户需具备访问.NET Framework相关文件和注册表项的权限。若使用低权限账户(如本地服务),可能导致CLR加载失败。可临时切换为本地管理员权限账户,重启服务后测试。查看CLR宿主详细状态
执行以下查询获取CLR加载的详细信息:SELECT * FROM sys.dm_clr_appdomains; SELECT * FROM sys.dm_clr_tasks; SELECT * FROM sys.dm_clr_loaded_assemblies;若视图返回空或异常,结合SQL Server错误日志中
CLR相关条目,定位加载失败的具体原因。检查"clr strict security"策略
SQL Server 2017及以上版本默认启用clr strict security,未签名的CLR程序集会被拦截。执行以下查询检查配置:SELECT name, value, value_in_use FROM sys.configurations WHERE name = 'clr strict security';若配置为1且程序集未签名,可临时禁用测试(生产环境建议为程序集签名而非长期禁用):
EXEC sp_configure 'clr strict security', 0; RECONFIGURE;排查系统级干扰因素
确认系统PATH环境变量包含.NET Framework安装路径,且SQL Server进程可正常访问。临时关闭杀毒软件、调试工具等可能拦截CLR加载的程序,重启SQL Server后测试。
内容的提问来源于stack exchange,提问作者Vlad Charny

