【发布时间】:2017-06-20 10:49:19
【问题描述】:
伙计们,
有一个奇怪的给你。
我有一个存储过程,用于解析一些表格数据以创建适当的 SQL 几何对象。
SP 使用函数 MakeValid()。
就我而言,我发现了一些未通过测试的对象。但是,这些不会破坏存储过程。存储过程很高兴运行,并在结果中简单地显示错误。
消息 6522,级别 16,状态 1,行 257 发生 .NET Framework 错误 在执行用户定义的例程或聚合“几何”期间: System.FormatException:24306:
但是,当我在计划的作业中执行此 SP 时,它第一次遇到这些异常之一时,作业失败并且 SP 停止运行。
我实际上不确定在这里做什么。我尝试了一个 TRY..CATCH 块,但这并不能阻止引发的错误,并且作业仍然退出。
因此,虽然它是一个引发错误的 MakeValid 函数,但我想一个遇到函数错误的 SP 会导致同样的问题。
任何想法我可以如何处理这个?顺便说一句,除了标记错误然后返回并修复它们之外,我无法控制输入质量。不过,我仍然希望处理其余的有效记录。
这是可操作的代码部分。
SET @GEOM = geometry::STGeomFromText(@GEOMWKT, 4326)
IF @GEOM.STIsValid() = 0
BEGIN
BEGIN TRY
SET @GEOM = @GEOM.MakeValid()
END TRY
BEGIN CATCH
Print 'Error here'
END CATCH
END
这是一个引发错误的无效几何的示例。
SET @GEOM = geometry::STGeomFromText('LINESTRING(-121.895652 37.37225, -121.895652 37.37225)', 4326)
感谢您的所有帮助。
【问题讨论】:
-
您正在检查
@GEOM,但对@VALGEOM执行操作。这是你的意图吗? -
坚果。那将是最简单的解决方案。你能提供一个产生这个错误的简单 WKT 吗?
-
这里是一个引发错误的语法示例。 SET @GEOM = geometry::STGeomFromText('LINESTRING(-121.895652 37.37225, -121.895652 37.37225)', 4326) 也添加到原始问题中。
-
那条线的两个端点是同一个点。因此,我认为它不是有效的 WKT。也就是说,无法使它有效。你的期望是什么?那个 MakeValid 返回一个 NULL 值?
-
在其他新闻中,我的笔记本电脑上有一个 SQL 2014 实例,您指定的几何实例和调用
MakeValid()都对我有用。所以这可能只是“空间是 2008 年的 v1;警告购买者”的情况。
标签: sql sql-server stored-procedures sql-server-2008-r2