将SQL生成的地理类型数据加载至Vertica时出错的问题咨询
SQL Server的geography类型和Vertica的确实存在实现差异,直接用SQL Server生成的geography对象导出的数据,无法直接导入Vertica的geography列,核心问题出在格式要求和坐标系声明方式上。
错误原因分析
你用geography::Point(Latitude, Longitude, 4326)生成的WKT格式字符串POINT (-96.8922825 33.08097)是标准WKT,但Vertica的geography类型在导入时,默认需要明确的坐标系(SRID)声明——标准WKT本身不包含SRID信息,导致Vertica无法解析该值对应的地理坐标系。
解决方法
方法一:在源端生成Vertica兼容的EWKT格式
修改SQL Server的转换逻辑,直接生成带SRID的扩展WKT(EWKT)字符串,而非SQL Server原生的geography对象:
CASE WHEN (Latitude IS NOT NULL AND Longitude IS NOT NULL) THEN 'SRID=4326;POINT(' + CAST(Longitude AS VARCHAR(50)) + ' ' + CAST(Latitude AS VARCHAR(50)) + ')' ELSE NULL END AS Coordinates
生成的结果类似SRID=4326;POINT(-96.8922825 33.08097),这种格式可以被Vertica直接识别并转换为geography类型。
方法二:在Vertica导入时显式转换
如果无法修改源端输出,在Vertica的COPY语句中使用ST_GeographyFromText函数,手动指定SRID完成转换:
COPY your_target_table ( -- 其他列定义 Coordinates AS ST_GeographyFromText(?, 4326) ) FROM '/path/to/your/data_file' DELIMITER ','; -- 根据你的实际数据分隔符调整
该函数会将标准WKT字符串转换为Vertica兼容的geography类型,并绑定4326坐标系。
方法三:确保目标表列定义正确
确认Vertica目标表的geography列明确指定了4326坐标系:
CREATE TABLE your_target_table ( -- 其他列 Coordinates GEOGRAPHY(4326) );
补充说明
SQL Server的geography::Point参数顺序是(纬度,经度),而WKT标准的POINT格式是(经度,纬度),你当前的代码已经正确处理了这个顺序,无需调整坐标位置,问题核心是坐标系的声明方式。
内容的提问来源于stack exchange,提问作者Malavika N

