SQL发布报错:未找到system.net.http, version=4.0.0.0程序集
System.Net.Http程序集未找到的问题 你遇到的这个报错,核心原因很明确:虽然你的本地项目里引用了System.Net.Http,但SQL Server的CLR运行环境并没有这个程序集的注册记录——SQL Server执行CLR函数时,会从自身的程序集目录(SQL catalog)里查找所有依赖项,本地项目的引用只负责编译,不会自动同步到数据库里。
下面是具体的解决步骤:
第一步:确保SQL Server允许CLR程序集运行
默认情况下SQL Server可能禁用了CLR功能,先执行以下命令开启:sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE;如果你用的是SQL Server 2017及以上版本,还需要处理
clr strict security的限制(这个设置默认启用,会阻止未签名的程序集运行)。如果暂时只是测试,可以先关闭它:sp_configure 'clr strict security', 0; RECONFIGURE;注意:生产环境建议给程序集添加强签名,再通过证书或登录名授权,而不是直接关闭严格安全设置。
第二步:将
System.Net.Http部署到SQL Server
找到对应版本的System.Net.Http.dll文件(通常在C:\Windows\Microsoft.NET\Framework64\v4.0.30319\路径下,根据你的系统位数和.NET版本调整),然后用SQL命令注册到目标数据库:CREATE ASSEMBLY [System.Net.Http] FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll' WITH PERMISSION_SET = SAFE;如果该程序集已经存在但版本不匹配,可以用
ALTER ASSEMBLY命令更新:ALTER ASSEMBLY [System.Net.Http] FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll';一定要确保你部署的程序集版本是
4.0.0.0,公钥令牌是b03f5f7f11d50a3a,和报错信息完全一致。第三步:调整数据库项目的发布设置
在你的SSDT数据库项目里,右键项目→属性→找到“SQLCLR”选项,确认“Include all referenced assemblies”(包含所有引用的程序集)选项是勾选状态。这样在生成发布脚本时,会自动包含依赖程序集的创建语句,避免后续发布再出现遗漏。第四步:验证依赖关系
部署完成后,可以用以下命令检查数据库里的程序集依赖:SELECT a.name AS AssemblyName, referenced_assembly_name AS DependentAssembly FROM sys.assemblies a JOIN sys.assembly_references ar ON a.assembly_id = ar.assembly_id WHERE a.name = '你的CLR程序集名称';确认
System.Net.Http已经被列为依赖项,且状态正常。
简单总结一下:本地项目的引用是编译层面的,SQL Server的CLR运行需要实际把依赖程序集部署到数据库中,这两个环节是独立的,你之前只完成了前者,漏掉了后者的部署步骤。
内容的提问来源于stack exchange,提问作者Mikhail Kostiuchenko

