SQL Server无法创建CLR程序集,引用System.Runtime 5.0.0.0报错
我正在尝试创建首个CLR程序集,已在Visual Studio中生成DLL文件,现在要在SQL Server中使用它。执行以下CREATE ASSEMBLY语句:
CREATE ASSEMBLY SQLCLRroy FROM '...\SqlExternalFunctions\bin\Debug\net5.0\SQLExternalFunctions.dll';
时出现错误:
Assembly 'SqlExternalFunctions' references assembly 'system.runtime, version=5.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database.
查阅资料后尝试执行以下语句手动注册:
CREATE ASSEMBLY [System.Runtime] FROM 'C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0\System.Runtime.dll'
却收到警告:
Warning: The Microsoft .NET Framework assembly 'system.runtime, version=5.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' you are registering is not fully tested in the SQL Server hosted environment and is not supported.
我的.NET代码仅引用了System.Data.SqlClient,代码如下:
using System; using System.Linq; public static class SqlExternalFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static int myTest(int param ) { return param; } }
是否需要取消对System.Runtime的引用?
不需要手动取消对System.Runtime的引用,问题根源在于你用了**.NET 5(.NET Core)**构建CLR程序集,但SQL Server对.NET Core的CLR支持有严格限制:
SQL Server CLR的原生支持范围
传统SQL Server CLR只原生兼容**.NET Framework**(最高到4.x版本),.NET Core/.NET 5+的程序集依赖的核心库(比如System.Runtime)属于.NET Core专属,不在SQL Server预注册的支持列表里,手动注册必然触发不支持的警告。而且哪怕你代码里没显式引用System.Runtime,.NET Core编译的程序集会自动依赖这些框架级基础库,这是默认行为。正确的修复步骤
- 切换项目目标框架:在Visual Studio里右键项目→属性→应用程序→目标框架,选择.NET Framework 4.6.1及以上版本(SQL Server 2016+推荐用4.6.1,匹配SQL Server的CLR支持版本)。
- 重新编译程序集:切换框架后,删除原bin/Debug下的.NET 5编译产物,重新生成DLL。此时编译出的程序集依赖的是.NET Framework的库,其中大部分核心库已经由SQL Server预注册,不会再出现缺失
System.Runtime的错误。 - 重新执行注册语句:用新生成的.NET Framework版本DLL执行
CREATE ASSEMBLY,即可正常完成注册。
额外注意点
确保SQL Server的CLR功能已启用,执行以下语句开启:sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE;要是你坚持想用.NET Core/.NET 5+,只有SQL Server 2022及以上版本支持.NET 6+的CLR集成,但需要用专用的
dotnet sqlclr publish工具部署,不建议新手首次尝试时走这条路。
内容的提问来源于stack exchange,提问作者roy bottomley

