将SQL表中varchar(max)类型多面形转换为geography类型报错求助
问题分析与解决方案
首先你的INSERT语句逻辑错误,INSERT是向表中新增行,而你需要的是给已有行的新字段GeoLocation赋值,应该用UPDATE语句。
修正基础代码
ALTER TABLE dbo.Geoboundaries ADD [GeoLocation] GEOGRAPHY; UPDATE dbo.Geoboundaries SET GeoLocation = GEOGRAPHY::STGeomFromText(shapeGeometry, 4326) WHERE shapeGeometry IS NOT NULL AND shapeGeometry != '';
常见报错原因及处理
如果修正语句后仍报错,大概率是以下问题:
- WKT格式不合法:检查
shapeGeometry字段的内容是否符合OGC WKT标准,比如MULTIPOLYGON(((x1 y1, x2 y2,...)))的括号是否配对、坐标是否用逗号分隔等。可以先取单条数据测试定位问题:
SELECT GEOGRAPHY::STGeomFromText(shapeGeometry,4326) FROM dbo.Geoboundaries WHERE [主键字段] = '某条测试数据ID';
找到格式错误的行后修正对应WKT内容。
- 多边形方向不符合要求:SQL Server的
geography类型要求多边形遵循右手定则(外部环逆时针,内部环顺时针),否则会抛出"24204"错误。可以用MakeValid()方法自动修正:
UPDATE dbo.Geoboundaries SET GeoLocation = GEOGRAPHY::STGeomFromText(shapeGeometry, 4326).MakeValid() WHERE shapeGeometry IS NOT NULL AND shapeGeometry != '';
- 坐标超出地理范围:
geography要求纬度在[-90,90],经度在[-180,180],超出范围的坐标会报错。可以先筛选出异常行排查:
SELECT shapeGeometry FROM dbo.Geoboundaries WHERE shapeGeometry LIKE '%[^0-9., ()+-]%' -- 检查是否含非法字符 OR PATINDEX('%,[^-0-9.]%,%', shapeGeometry) > 0; -- 粗略排查坐标格式异常
- 空值或空字符串:通过
WHERE条件过滤空值,避免无效转换报错。
内容的提问来源于stack exchange,提问作者Turtle
相关产品推荐
相关产品推荐

