如何在调用外部程序集的SQL函数中更新@inputGeometry参数?
解决方案
因为你当前的函数是基于CLR的外部函数,无法直接在其内部添加输入修复逻辑,最稳妥的方式是包装一层T-SQL函数,先对传入的geometry对象执行修复,再将修复后的对象传递给原CLR函数。
具体实现代码
假设你的修复逻辑可以用STMakeValid()(你可以替换为自己已掌握的修复代码),示例如下:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- 创建带修复逻辑的包装函数,也可以直接替换原函数名(需先删除原CLR函数) CREATE OR ALTER FUNCTION [dbo].[MakeValidGeographyFromGeometry_Safe](@inputGeometry [geometry]) RETURNS [geography] WITH EXECUTE AS CALLER AS BEGIN -- 1. 执行geometry修复逻辑(替换为你的实际修复代码) DECLARE @fixedGeometry [geometry] SET @fixedGeometry = @inputGeometry.STMakeValid() -- 可选:确保修复后的geometry使用地理坐标系SRID(如WGS84的4326) -- 因为geography类型要求必须使用地理坐标系的SRID,否则转换会失败 IF @fixedGeometry.STSrid <> 4326 BEGIN SET @fixedGeometry = @fixedGeometry.STTransform(4326) END -- 2. 将修复后的对象传入原CLR函数 RETURN dbo.MakeValidGeographyFromGeometry(@fixedGeometry) END GO
额外说明
- 如果希望保持原函数调用方式不变,可以先删除原CLR函数,再将上述包装函数命名为
MakeValidGeographyFromGeometry - 若你的修复逻辑复杂(比如需要处理自相交多边形、无效环等特殊情况),可以将修复逻辑单独封装成一个T-SQL函数,再在包装函数中调用
- 注意:修复后的
geometry仍需符合geography类型的约束(比如不能包含跨半球的多边形),否则原CLR函数仍可能报错,这种情况需要额外添加针对性处理逻辑
内容的提问来源于stack exchange,提问作者user25730
相关产品推荐
相关产品推荐

