如何在本地U-SQL Catalog注册SQLServerSpatial DLL?遇系统程序集报错求解决
解决本地注册Microsoft.SqlServer.Types程序集的问题
这是个很典型的系统程序集权限问题——本地SQL Server已经预装了Microsoft.SqlServer.Types作为系统级程序集,所以你没法手动重复注册它,而Azure Data Lake的运行环境和本地SQL Server的CLR管理机制不一样,才允许你注册。下面给你几个可行的解决方向:
1. 先确认本地SQL Server是否已经自带该程序集
本地SQL Server(尤其是2016及以上版本)默认就包含Microsoft.SqlServer.Types程序集,你可以先执行以下查询确认它的存在和版本:
SELECT name, version, permission_set_desc FROM sys.assemblies WHERE name = 'Microsoft.SqlServer.Types';
如果查询结果里有版本13.0.0.0的记录,那你完全不需要手动注册,直接在SQL代码或应用程序里使用它提供的空间功能就行。
2. 用绑定重定向适配版本差异
如果你的应用程序要求特定版本的Microsoft.SqlServer.Types,但本地SQL Server里的版本不匹配,可以通过绑定重定向让应用指向SQL Server已有的版本。在你的应用配置文件(app.config或web.config)里添加以下配置:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" /> <!-- 把oldVersion范围改成你应用需要的版本,newVersion改成本地SQL Server实际的版本 --> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
3. 按照错误提示创建自定义封装程序集
如果确实需要扩展空间功能,或者必须使用自定义逻辑,你可以自己写一个CLR程序集封装Microsoft.SqlServer.Types的功能,再注册这个自定义程序集到本地SQL Server:
步骤示例:
- 新建一个.NET类库项目,添加对
Microsoft.SqlServer.Types(版本13.0)的引用; - 编写封装空间操作的方法,比如:
using Microsoft.SqlServer.Types; using Microsoft.SqlServer.Server; public class CustomSpatialTools { [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)] public static SqlGeometry CreateCustomPoint(double lat, double lon) { // 这里可以添加自定义逻辑,比如验证坐标范围 if (lat < -90 || lat > 90 || lon < -180 || lon > 180) return null; return SqlGeometry.Point(lon, lat, 4326); } }
- 编译项目后,在SQL Server里注册这个自定义程序集:
CREATE ASSEMBLY CustomSpatialToolsAssembly FROM 'C:\YourProject\bin\Release\CustomSpatialTools.dll' WITH PERMISSION_SET = SAFE;
- 最后创建对应的SQL函数来调用这个CLR方法:
CREATE FUNCTION dbo.CreateCustomPoint(@lat float, @lon float) RETURNS geometry AS EXTERNAL NAME CustomSpatialToolsAssembly.CustomSpatialTools.CreateCustomPoint;
4. 检查SQL Server版本兼容性
注意Microsoft.SqlServer.Types的版本和SQL Server版本是一一对应的:
- 13.0.0.0 → SQL Server 2016
- 14.0.0.0 → SQL Server 2017
- 15.0.0.0 → SQL Server 2019
如果你的本地SQL Server版本低于2016,那它不会自带13.0版本的程序集,这种情况你可能需要升级SQL Server,或者降级使用对应版本的Microsoft.SqlServer.Types。
内容的提问来源于stack exchange,提问作者Tysklind-MSFT
相关产品推荐
相关产品推荐

