У вас есть значение g.geocode_latitude
или g.geocode_longitude
, которое пусто или недопустимо в качестве координаты.
Попробуйте выполнить следующее, вы увидите, что это не с тем же сообщением об ошибке:
SELECT geometry::Parse('POINT(43 )') -- Missing coordinate
Чтобы решить, просто отфильтруйте, где обе координаты действительно информированы и правильны (выражение зависит от типа данных). Вы можете использовать TRY_PARSE
в этом отношении.
Чтобы проверить строки ошибок, вы можете сделать быструю проверку с помощью:
SELECT
T.*
FROM
MyDB.dbo.geocodes_raw AS T
WHERE
TRY_PARSE(T.geocode_longitude AS FLOAT) IS NULL OR
TRY_PARSE(T.geocode_latitude AS FLOAT) IS NULL
Или более тщательно (но медленнее) с курсором:
IF OBJECT_ID('tempdb..#ErrorGeocodes') IS NOT NULL
DROP TABLE #ErrorGeocodes
CREATE TABLE #ErrorGeocodes (
geocode_longitude VARCHAR(200),
geocode_latitude VARCHAR(200))
DECLARE @c_geocode_longitude VARCHAR(200)
DECLARE @c_geocode_latitude VARCHAR(200)
DECLARE GeocodeCursor CURSOR FOR
SELECT DISTINCT
T.geocode_longitude,
T.geocode_latitude
FROM
MyDB.dbo.geocodes_raw AS T
OPEN GeocodeCursor
FETCH NEXT FROM GeocodeCursor INTO @c_geocode_longitude, @c_geocode_latitude
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
DECLARE @v_GeometryTest GEOMETRY =
GEOMETRY::Parse('POINT(' + @c_geocode_longitude + ' ' + @c_geocode_latitude + ')')
END TRY
BEGIN CATCH
INSERT INTO #ErrorGeocodes (
geocode_latitude,
geocode_longitude)
SELECT
geocode_latitude = @c_geocode_latitude,
geocode_longitude = @c_geocode_longitude
END CATCH
FETCH NEXT FROM GeocodeCursor INTO @c_geocode_longitude, @c_geocode_latitude
END
CLOSE GeocodeCursor
DEALLOCATE GeocodeCursor
SELECT * FROM #ErrorGeocodes